Проблема с загрузчиком clickonce и msbuild

У меня есть сервер сборки CruiseControl.NET, работающий на Windows Server 2003, и я пытаюсь создать и опубликовать приложение ClickOnce с помощью msbuild.

Все работает нормально, за исключением случаев, когда я включаю bootstrapper моего приложения ClickOnce. Когда это произойдет, я получаю следующую ошибку в цели DeploymentGenerateBootstrapper:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3939,9):

error MSB3147: 

Could not find required file 'setup.bin' in 'E:\Projects\src\TestProject\Engine'.

.NET Framework 3.5 с пакетом обновления 1 и 4 и последний пакет Windows SDK для обоих установлены на сервере, но папка bootstrapper в C:\Program Files\Microsoft SDK\Windows\versionNo\не существует. Я попытался скопировать файлы с моей рабочей станции без везения.

Я не хочу устанавливать Visual Studio на сервер и устанавливать только необходимые SDK.

Я также попытался скопировать папку bootsrapper с моей машины

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper

чтобы создать сервер, но не повезло.

Любые идеи?

Ответ 1

Вам также необходимо добавить связанный ключ и значение в реестр, чтобы позволить MSBuild найти путь к папке Bootstrapper. Я могу подтвердить, что это сработало для меня, используя следующий regedit.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\4.0]
@="0"
"Path"="C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bootstrapper\\"

Обновление: В соответствии с блоком Emma TFS он показывает, что для проверки пути начальной загрузки проверяются следующие значения реестра, и если они не найдены в вашей локальной папке проекта в подкаталоге Engine, а затем подзаголовок с ошибкой MSB3147, если она не найдена.

  • HKLM\Software\Microsoft\GenericBootstrapper\<.NET Tools Version > \
  • HKLM\Software\Microsoft.NetFramework\SDKInstallRoot\Bootstrapper
  • HKLM\Software\Microsoft\VisualStudio\\InstallDir\Bootstrapper

Напоминание: Также помните, что есть 32-разрядный и 64-разрядный реестр, поэтому обязательно добавьте это значение в тот же реестр, к которому будут обращаться ваши инструменты.

Тем временем я также создал запрос функции, чтобы получить более разумное решение этой проблемы. Просьба проголосовать за мой запрос, чтобы Microsoft взглянула на него.

Кстати, вот еще несколько ссылок по этой проблеме:

Ответ 2

Вы также можете передать местоположение пакетов bootstrapper в общую цель Publish следующим образом:

<PropertyGroup>
     <BootstrapperSdkPath>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper</BootstrapperSdkPath>
</PropertyGroup>

а затем

<Target Name="Publish">
    <MSBuild Targets="publish" ... Properties="GenerateBootstrapperSdkPath=$(BootstrapperSdkPath); ..."/>
</Target>

Ответ 3

Я боролся с той же проблемой на моей машине win7 x64. Я не установил Visual Studio и попытался создать и опубликовать решение .NET 4.5 WPF. Мне пришлось добавить следующие ключи в реестр

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\GenericBootstrapper\11.0]
"Path"="C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\Bootstrapper\\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\GenericBootstrapper\4.0]
"Path"="C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\Bootstrapper\\"

Вам также нужно скопировать папки Bootstrapper с вашей машины dev. Эта blogpost направила меня в правильном направлении http://www.wiktorzychla.com/2013/11/msb3147-could-not-find-required-file-on.html

Ответ 4

У меня была аналогичная проблема, но в моем случае у меня есть Visual Studio, установленная на этом поле, и публикация из Visual Studio отлично работает. При публикации из командной строки с msbuild.exe сбой сборки с вышеупомянутой ошибкой "MSB3147 Не удалось найти требуемый файл setup.bin".

Решение заключалось в том, чтобы явно указать, какую версию Visual Studio использовать во время сборки.

<MSBuild
  Projects="MyProject.csproj"
  Targets="publish"
  Properties="Configuration=Release;PublishUrl=C:\AnyFolder;VisualStudioVersion=12.0"/>

У меня есть Visual Studio 2013 на машине Win7 x64. Мое чтение проблемы заключается в том, что MSBuild искал не то место в реестре. Явным образом сообщая MS Build использовать VS 12.0, он выбрал правильную запись в регистре и, следовательно, правильный путь к BootstrapperSdkPath.

Ответ 5

Я смог исправить эту проблему, указав на MSBuild.exe из этого местоположения

C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe

Раньше я указывал на

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

Ответ 6

Привет, я знаю, что этот ответ о нем так поздно, но на всякий случай

Мне пришлось добавить ссылку "Путь" к задаче с помощью Пути, где находится загрузочный блок, в моем случае я использовал Visual Studio 2015, так что путь:

** Программные файлы (x86)\Microsoft Visual Studio 14.0\SDK\Boostrapper **

MSBuild имеет Task GenerateBootstrapper в моем случае

    <GenerateBootstrapper> 
       AplicationFile="$(AppName)"
       ApplicationName=..
       ApplicationUrl=..
       BootstrapperItems=..
       Culture=..
       ApplicationUrl=.. 
       Path="Program Files(x86)\Microsoft Visual Studio 14.0\SDK\Boostrapper\"
    </GenerateBootstrapper>

с этим MSBuild может распознавать и генерировать файл

Теперь я привязан к загрузочному блоку .net 4, но думаю, это еще одна история...

Ответ 7

Я столкнулся с такой же ошибкой на моем сервере сборки TeamCity. Причиной в моем случае было то, что я запускал задачу MSBuild против моего .sln файла с целью "MyProject: publish". В этом случае решение + projecth было обновлено до версии .NET v4.5, но сервер сборки по-прежнему настроен на использование MSBuild Tools 4.0 и .NET версии 4.0.

Мне потребовалось немного времени, чтобы разобраться в несогласованности между рабочими и нерабочими ветвями.

Ответ 8

Я добавил эту строку в script. Это помогло.

call "%VS120COMNTOOLS%vsvars32.bat"

Visual Studio 2013, SDK v8.1A.

Ответ 9

Просто с этим справился - я решил передать файлы bootstrapper в исходный элемент управления. Можно переопределить путь к загрузчикам, просто укажите /p:GenerateBootstrapperSdkPath=.build\Bootstrapper

Тогда нет необходимости изменять реестр - и добавленное преимущество, которое теперь самоподдерживается.

Только "проблема" заключается в том, что мне приходится вручную копировать файлы Bootstrapper в исходный элемент управления. В моем случае (VStudio2015) это означало копирование файлов из C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper