Подтвердить что ты не робот

Построение целевой MSBuild без зависимостей

Можно ли каким-либо образом указать MSBuild 4.0 для создания цели, но игнорировать любые зависимости? Я просто хочу построить эту цель сам по себе, ничего больше.

4b9b3361

Ответ 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=

который присваивает этому свойству ничего, и поэтому никаких зависимостей.