Сборка цели MSBuild без зависимостей - PullRequest
24 голосов
/ 28 февраля 2011

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

Ответы [ 5 ]

46 голосов
/ 15 ноября 2011

Я хотел бы повторить решение @ EMP (и не могу проголосовать за него из-за своей ничтожной репутации).

Правильный способ избежать стандартного поведения MSBuild при восстановлении всех зависимостей, перечисленных в файле проекта, - установить для свойства BuildProjectReferences значение false.

В своем ответе он вызывает MSBuild из скрипта MSBuild; Вот пример из командной строки:

MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build
14 голосов
/ 03 марта 2011

Оказывается, встроенная цель Build проверяет свойство с именем BuildProjectReferences, чтобы определить, создавать ссылки или нет.Мне нужно запустить Build для самого проекта (в противном случае он не работает), но не для его зависимостей.В итоге я позвонил:

<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />
3 голосов
/ 02 марта 2011

Может быть возможно переопределить встроенную цель, добавить ваше собственное условие, и ваша цель будет дублировать оригинал, но это может быть довольно сложным.Если вы можете отследить одну зависимую встроенную цель, это может быть осуществимо.Иногда эти «основные» цели состоят из не более чем списка DependsOnTargets, а иногда даже те, которые определены в свойстве, поэтому переопределить его и добавить условие, в котором они отсутствуют, тривиально.Иногда, хотя вам нужно сделать большую вырезку и вставку, чтобы сделать это правильно.

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

Например, добавление условия к цели «CoreBuild» из Microsoft.Common.targets выглядит так:это легко сделать, сохраняя то же самое поведение в противном случае (условие Target со свойством $ (SkipCoreBuild) ниже):

<Target
    Name="CoreBuild"
    Condition="'$(SkipCoreBuild)' != 'true'"
    DependsOnTargets="$(CoreBuildDependsOn)">

    <OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent"
        Condition="'$(RunPostBuildEvent)'=='Always' or
            '$(RunPostBuildEvent)'=='OnOutputUpdated'"
        />
    <OnError ExecuteTargets="_CleanRecordFileWrites" />
</Target>

Поместив вышеупомянутое в ваш собственный файл целей и импортировав его в проект C # послестандарт ...

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

... переопределяет реализацию по умолчанию, в которой нет условия для ее выборочного отключения.

В любом случае, если вы найдете цельэто не позволяет вам изменить условие, я бы подал ошибку в Connect, описывающую то, что вы пытаетесь сделать, люди MSBuild могутбыть довольно отзывчивым к подобным вещам (со временем).

1 голос
/ 28 февраля 2011

Обычно зависимости цели указываются с помощью свойства, например:

<Target Name="Foo" DependsOnTargets="$(FooDependsOn)">..</Target>

В таком случае вы можете вызвать msbuild как

msbuild bar.proj /p:FooDependsOn=

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

1 голос
/ 28 февраля 2011

Это зависит от цели, которую вы хотите построить.
Если цель встроена и имеет зависимости (например, «Построить»), вы не можете удалить зависимости.
Если это ваша собственная цель, вы можете легко реализовать ее:

<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>
...