Почему Tfs2010 создает мой проект Wix раньше всего?

Аналогичный вопрос задавали и отвечали примерно год назад, но это была другая проблема (все было в бета-версии) или неправильно диагностировано. Он находится здесь: Задача MSbuild завершилась неудачно, потому что "Любой CPU" решение построено не по заказу.

Моя проблема в том, что у меня есть проект установщика wix, и после обновления до Tfs2010 в понедельник сборка не работает при связывании, потому что она не может найти продукт сборки приложения Wpf в проекте. После некоторого рытья, потому что он еще не построен. Здание в Vs2010 работает как обычно. Проект wix установлен в зависимости от проекта Wpf, и при просмотре Project Build Order в среде IDE все выглядит как обычно.

Проблема была первоначально встречена только с двумя определениями платформы в решении; x86 и x64. Есть также два варианта: Debug и Release, а TFSBuild.proj настроен на сбор всех четырех комбинаций. В AnyCPU не было места. По указанному выше вопросу я попытался изменить проект Wpf на использование AnyCPU, чтобы он был построен первым. На этом этапе проект wix использовал точную конфигурацию, а проект Wpf использовал аромат с AnyCPU. Однако это не изменило ничего.

Я использую RTF RTF RTM, Vs2010 RTM и самую последнюю версию Wix, которая на момент написания этой статьи была 3.5.1602.0, с 2010-04-02. Кто-нибудь еще сталкивается с этим?

2010-04-27: после достаточного количества копания и воспроизведения на клонированной машине сборки VM, я считаю, что знаю, что происходит, а также то, что не удается, но я не совсем знаете, как это исправить.

Ситуация заключается в том, что эта ошибка, по-видимому, проявляет симптомы, основанные на простом заказе проекта "Удача в рисовании" в файле решения. Кажется, что файл решения будет просто слепо строить проекты в том порядке, в котором они появляются, опираясь на его способность обнаруживать незастроенные ссылки и строить их по требованию, когда это необходимо.

В моем конкретном файле решения мой проект Wix был заказан перед моим проектом приложения Wpf. Это привело к тому, что сначала был создан проект Wix, и в то время как зависимость от проекта Wpf была обнаружена правильно, фактическая задача MSBuild была пропущена из-за переменной undefined $(BuildProjectReferences). Я упоминаю пару комментариев с основного сообщения в этой теме. С многословием MSBuild, все еще находящимся в диагностике, BuildProjectReferences можно рассматривать как undefined, создавая проект Wix, и его можно увидеть определенным как true при создании проекта Wpf в рамках задачи для создания проекта Wix. Тем не менее, при тестировании он снова оценивает undefined, задача пропускается, а сборка Wix выходит из строя, потому что она не может найти результат сборки незастроенного проекта Wpf.

Итак, нижняя строка: зависимость проекта пропускается из-за плохой переменной $(BuildProjectReferences). Интересно, что эта переменная присутствует только в файле Wix2010.targets, а не в wix.targets; Я предполагаю, что это происходит только после того, как я установил Tfs2010 и Vs2010.

Решение. Как убедиться, что BuildProjectReferences правильно переданы для последующих задач MSBuild? Есть ли что-то особенное с переменным охватом?

2010-09-14: ошибка была обнаружена для этой проблемы в наборе инструментов WiX: http://sourceforge.net/tracker/?func=detail&atid=642714&aid=2990231&group_id=105970 и исправлено некоторое время назад. Надеюсь, это уже не проблема. Если это так, пожалуйста, откройте новую ошибку.


Чтобы напрямую ответить на ваш комментарий, ничто в моем решении не имеет конфигурации AnyCPU в своих файлах сборки. Я создал конфигурации AnyCPU только для проверки решения, предложенного потоком, с которым я связан, в моем исходном сообщении. После того, как это не сработало, я снова удалил конфигурации AnyCPU.

Кроме того, проекты находятся в одном файле решений, однако в отдельных папках решений (папка с интерфейсом, папка установщика), если это имеет значение.

Интересно, что я собирался сделать небольшой пример песочницы, чтобы я мог проиллюстрировать проблему, с которой я столкнулся, однако после создания моего маленького образцового решения я не смог получить ошибку для воспроизведения. Это заставляет меня думать, что, возможно, это результат использования командного проекта, который был обновлен из проекта команды Tfs2008, а не того, который был создан в Tfs2010. Я могу попробовать развернуть мой проект в новый, чтобы проверить эту теорию, если я не могу понять, почему работает тестовое решение.

p.s. Кроме того, я новичок в stackoverflow - почему комментарии ограничены по длине, если рабочий процесс "ответит на свой вопрос" предназначен только для предоставления конкретных ответов?


Итак, я бросил сборку подробностей до диагностики и прочитал ее сегодня, и одна строка, в частности, выделялась мне:

Task "MSBuild" skipped, due to false condition; ('@(_ProjectReferenceWithConfiguration)'!='' and '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildProjectReferences)' == 'true' and '@(_MSBuildProjectReferenceExistent)' != '') was evaluated as ('..\WpfApp\WpfApp.csproj'!='' and '' != 'true' and '' == 'true' and '..\WpfApp\WpfApp.csproj' != '').

Это было замечено, поскольку мой проект-установщик пытался создать мой проект wpf с момента ссылки на проект wpf. В частности, по какой-то причине $(BuildProjectReferences) оценивает "когда я уверен, что это должно быть" правда ".

Однако ранее в журнале, в начале задачи MSBuild для проекта WpfApp, я увидел это:

Task "MSBuild" (TaskId:15)
...
Initial Properties:
...
BuildProjectReferences = true

Итак, свойство действительно было правильным до начала задания, но затем, по-видимому, было перезаписано? Я не понимаю, как эти свойства устанавливаются.

Ответ 1

После того, как Роб Меншинг отредактировал мой оригинальный пост, кажется, что это действительно исправлено в самом WiX 3.6.0917.0.

Ответ 2

Его ошибка, ошибка, ошибка. Dunno, кто несет ответственность, но здесь работает грязный грязный хак:

  • Откройте файл .sln в блокноте.
  • Найдите свои проекты wix в списке проектов.
  • Вырежьте их и вставьте их обратно после того, как будут указаны все другие проекты.
  • Плачьте в душе, когда вы пытаетесь вычистить грязную грязь, только чтобы появиться спустя несколько часов, протерте сырым и все еще с вонью грязи, прилипающей к вам, как кожа трупа.

Ответ 3

Я видел эту проблему (wix 3.7 не находил зависимый выход проекта) в моих локальных и TFS-сборках (как для VS2010, так и для VS2012).

Я, наконец, обошел его, установив свойство msbuild /m:1 для использования только одного процесса сборки. Я установил /m, чтобы позволить msbuild выяснить, сколько процессов он может использовать для одновременной сборки.

Ответ 4

TFS использует набор свойств для управления именами решений и конфигураций для построения (итерации). Для каждой комбинации решений и конфигурации он затем использует зависимость проектов/порядок сборки для управления порядком создания проектов. Возможно, что ваш EXE/DLL - AnyCPU, а ваш WiX - x86, и хотя WiX имеет зависимость от EXE/DLL, x86 создается до вашего AnyCPU. Или, может быть, они даже в разных решениях, поэтому трудно сказать, не глядя на ваш источник, но в основном, как это работает.

Ответ 5

Что мы сделали, это сначала сообщить об ошибке для wix, а затем мы нашли ваш вопрос.

Мы решили проблему на нашей стороне, сказав, что по умолчанию проект wix будет создавать ссылки. Мы обновили файл C:\Program Files\MSBuild\Microsoft\WiX\v3.5\wix2010.targets, установив <BuildProjectReferences>True</BuildProjectReferences> в проект, который задает путь. Итак, да, мы сделали это вручную; мы сообщили об ошибке, а также о нашем исправлении.

Ответ 6

Сегодня я столкнулся с такой же проблемой и нашел решение, подобное этому:

Откройте файл решения в блокноте, найдите свой проект установки и измените настройку postProject. Это скажет msbuild, что этот проект должен ждать другого проекта для сборки. Я не знаю, почему, но он не добавлен по умолчанию.

Project("{GUID}") = "MyInstaller", "MyInstallerPath", "{Installer Project GUID}" ProjectSection(ProjectDependencies) = postProject {Prebuild Project GUID} = {Prebuild Project GUID} EndProjectSection EndProject

'Prebuild Project GUID' - это номер справа от проекта, который вы хотите установить.