Можно ли каким-либо образом указать MSBuild 4.0 для создания цели, но игнорировать любые зависимости? Я просто хочу построить эту цель сам по себе, ничего больше.
Построение целевой MSBuild без зависимостей
Ответ 1
Я хотел бы повторить решение @EMP (и я не могу проголосовать за него из-за моей ненадежной репутации).
Правильный способ избежать поведения MSBuild по умолчанию для перестройки всех зависимостей, перечисленных в файле проекта, - установить для свойства BuildProjectReferences
значение false.
В своем ответе он вызывает MSBuild из MSBuild script; вот пример из командной строки:
MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build
Ответ 2
Оказывается, встроенный Build
target проверяет свойство с именем BuildProjectReferences
, чтобы определить, нужно ли создавать ссылки или нет. Мне нужно запустить Build на самом проекте (иначе это не сработает), просто не на его зависимостях. В итоге я позвонил:
<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />
Ответ 3
Возможно, вы сможете переопределить встроенную цель, добавить свое собственное условие и дублировать оригинал оригинала, но это может стать довольно привлекательным. Если вы можете отслеживать одну зависимую встроенную цель, ее можно поддерживать. Иногда эти "основные" цели состоят не более, чем список DependsOnTargets, а иногда даже те, которые определены в свойстве, поэтому переопределение и добавление условия, в котором они отсутствуют, тривиально. Иногда, хотя вам нужно сделать большой вырез и вставить, чтобы все было правильно.
В основном, MSBuild будет поддерживать только последнюю цель, определенную для любого имени, поэтому найдите, где ваш проект импортирует файл .target, который включает цель, которую вы хотите переопределить, а затем разместите свой собственный импорт файла .target, который содержит переопределение после этого.
Например, добавление условия к цели "CoreBuild" из Microsoft.Common.targets так же просто, как и при сохранении того же поведения (условие цели с помощью свойства $(SkipCoreBuild) ниже):
<Target
Name="CoreBuild"
Condition="'$(SkipCoreBuild)' != 'true'"
DependsOnTargets="$(CoreBuildDependsOn)">
<OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent"
Condition="'$(RunPostBuildEvent)'=='Always' or
'$(RunPostBuildEvent)'=='OnOutputUpdated'"
/>
<OnError ExecuteTargets="_CleanRecordFileWrites" />
</Target>
Размещение вышеуказанного в файле собственных целей и его импорт в проект С# после стандартного...
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
... переопределит реализацию по умолчанию, которая не имеет условия для выборочного отключения.
В любом случае, если вы найдете цель, которая не позволяет вам изменять условие, я бы установил ошибку в Connect, описывающую то, что вы пытаетесь сделать, люди MSBuild могут быть очень отзывчивы к подобным вещам (со временем).
Ответ 4
Это зависит от цели, которую вы хотите построить.
Если цель встроена и имеет зависимости (например, "Сборка" ), вы не можете удалять зависимости.
Если это ваша собственная цель, вы можете легко ее реализовать:
<Target Name="YourTargetWithDependencies"
DependsOnTargets="YourTargetDependencies;YourTarget">
</Target>
<Target Name="YourTarget" >
</Target>
Для CorePublish в проекте облачных вычислений Azure, а также любой другой с настраиваемыми целевыми параметрами DependsOn вы можете попробовать изменить проект для изменения списка зависимостей по умолчанию:
<Target Name=CallPublish>
<!-- Modified list of dependencies. Build is skipped here. -->
<PropertyGroup>
<CustomCorePublishDependsOn>
PrepareForPackaging;
CheckRoleInstanceCount;
CopyServiceDefinitionAndConfiguration;
ConfigureWebDeploy;
IntelliTrace;
</CustomCorePublishDependsOn>
</PropertyGroup>
<MSBuild Projects="$(MSBuildProjectFullPath)"
Targets="CorePublish"
Properties="CorePublishDependsOn=$(CustomCorePublishDependsOn);Configuration=$(Configuration);Platform=$(Platform)">
</Target>
Ответ 5
Обычно целевые зависимости задаются с помощью свойства, например:
<Target Name="Foo" DependsOnTargets="$(FooDependsOn)">..</Target>
В таком случае вы можете вызывать msbuild как
msbuild bar.proj /p:FooDependsOn=
который присваивает этому свойству ничего, и поэтому никаких зависимостей.