Переопределение MSBuildExtensionsPath в задаче MSBuild облуплено

Это уже перекрестно разослано в MS Connect:

https://connect.microsoft.com/VisualStudio/feedback/details/560451

Я пытаюсь переопределить $ свойства (MSBuildExtensionsPath) при создании решения, содержащего проект веб-приложения C# через msbuild. Я делаю это, потому что веб-приложение csproj файл импортирует файл "$ (MSBuildExtensionsPath) \Microsoft\VisualStudio\v9.0\WebApplications\Microsoft. WebApplication.targets". Этот файл установлен Visual Studio на стандартном $ (MSBuildExtensionsPath) местоположение (C:\Program Files\MSBuild). Я хотел бы устранить зависимость от этого файла, устанавливаемого на машине (я хотел бы сохранить свои серверы сборки максимально "чистыми"). Чтобы сделать это, я хотел бы включать Microsoft. WebApplication.targets в управлении исходным кодом с моим проектом, и затем переопределяют $ (MSBuildExtensionsPath) так, чтобы csproj импортировал эту включенную версию Microsoft. WebApplication.targets. Этот подход позволяет мне удалять зависимость, не требуя, чтобы я вручную изменил веб-приложение csproj файл.

Эта схема хорошо работает, когда я создаю свой файл решения из командной строки, предоставляя пользовательское значение $ (MSBuildExtensionsPath) в командной строке к msbuild через флаг/p. Однако, если я пытаюсь создать решение с помощью задачи MSBuild в пользовательском msbuild файле проекта (переопределяющий MSBuildExtensionsPath с помощью атрибута "Свойств"), это перестало работать, потому что веб-приложение csproj файл пытается импортировать Microsoft. WebApplication.targets от "стандартной" Microsoft. Местоположение WebApplication.targets (C:\Program Files\MSBuild). В частности, если я выполняю msbuild использование "Исполнительной" задачи в моем пользовательском файле проекта, это работает. Еще заметнее в ПЕРВЫЙ раз я выполняю сборку с помощью задачи "MSBuild" ПОСЛЕ ТОГО, КАК я выполнил сборку с помощью "ИСПОЛНИТЕЛЬНОЙ" задачи (или непосредственно из командной строки), работы сборки.

Кто-либо видел поведение как это прежде? Действительно ли я являюсь сумасшедшим? Кто-либо знает о первопричине этой проблемы, возможного обходного решения, или является ли это законной ошибкой в MSBuild?

Шаги для репродуцирования:

1) Создайте новое пустое решение в MSVS 2008 (Fake.sln)

2) Добавьте новое веб-приложение C# к решению (WebApplication1.csproj)

3) Близкий MSVS

4) Скопируйте содержание "C:\Program Files\MSBuild\" к каталогу под названием "MSBuildExtensions" в каталоге, содержащем Ваше решение.

5) переименуйте каталог "C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications" так, чтобы WebApplication1.csproj не мог импортировать Microsoft. WebApplication.targets от того местоположения.

6) Создайте пользовательский файл проекта MSBuild под названием "TestBuild.proj" в том же каталоге как решение. Это должно иметь следующее содержание:





    $(MSBuildProjectDirectory)\MSBuildExtensions\
    Fake.sln



    
    



7) выполните "msbuild TestBuild.proj" от командной строки MSVS (примечание: сборка может успешно выполниться в первый раз, но перестанет работать, если Вы работаете несколько раз),

5
задан Stuart Lange 20 May 2010 в 21:16
поделиться

3 ответа

Это ошибка в MSBuild 3.5, но она исправлена в MSBuild 4.

Если возможно, переключитесь на MSBuild 4 (вы все еще можете компилировать проекты 3.5), в противном случае вам придется переопределить свойство в файле проекта.

3
ответ дан 13 December 2019 в 19:22
поделиться

Он отлично работает, если переопределить MSBuildExtensionsPath непосредственно в файле .csproj веб-приложения.

<PropertyGroup>
  <MSBuildExtensionsPath>C:\Users\madgnome\Desktop\msbuild</MSBuildExtensionsPath>

  <!-- It works too with relative path -->
  <!--<MSBuildExtensionsPath>..\msbuild</MSBuildExtensionsPath>-->
</PropertyGroup>

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
3
ответ дан 13 December 2019 в 19:22
поделиться

Вы пытались установить переменную среды MSBuildExtensionPath в командной строке CMD, а затем запустить сборку?

Например:

C:\> SET MSBuildExtensionsPath=C:\My\MSBuild\Extensons

Затем в этом файле проекта:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build">
    <Message Text='MSBuildExtensionsPath="$(MSBuildExtensionsPath)"' />
  </Target>
</Project>

вы получите следующее вывод:

c:\Users\chuckeng\Desktop\ConsoleApplication1>"C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" my.proj
Microsoft (R) Build Engine Version 3.5.30729.4926
[Microsoft .NET Framework, Version 2.0.50727.4927]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 6/25/2010 1:04:05 PM.
Project "c:\my.proj" on node 0 (default targets).
  MSBuildExtensionsPath="C:\My\MSBuild\Extensons"
Done Building Project "c:\my.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.03

Это работает и с v4.0. Хотя в версии 4.0 для подобных вещей поддержка в целом лучше. Кроме того, v4.0 на 100% обратно совместима (без ошибок). Итак, вы можете создавать свои проекты v3.5 и более ранние с v4.0. Просто выберите ToolsVersion 3.5.

msbuild my.proj /tv:3.5

Надеюсь, это поможет ...

Чак Инглэнд Visual Studio Менеджер программы - MSBuild

4
ответ дан 13 December 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: