构建没有依赖项的MSBuild目标

时间:2011-02-28 01:05:32

标签: msbuild msbuild-4.0

有什么方法可以告诉MSBuild 4.0构建目标,但忽略任何依赖项?我只想自己建立这个目标,没有别的。

5 个答案:

答案 0 :(得分:44)

我想重申@ EMP的解决方案(由于我的声誉很低,我不能投票给他。)

避免MSBuild重建项目文件中列出的所有依赖项的默认行为的正确方法是将BuildProjectReferences属性设置为false。

在他的回答中,他从MSBuild脚本中调用MSBuild;这是命令行的一个例子:

MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build

答案 1 :(得分:14)

事实证明,内置的Build目标会检查名为BuildProjectReferences的属性,以判断是否构建引用。我确实需要在项目本身上运行Build(否则它不起作用),而不是它的依赖项。我最后打电话给:

<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />

答案 2 :(得分:3)

有可能覆盖内置目标,添加自己的条件,并使目标复制原始目标,但这可能会相关。如果您可以追踪单个依赖的内置目标,则可以维护。有时这些“核心”目标只包含DependsOnTargets列表,有时甚至是那些在属性中定义的目标,因此覆盖它并添加它们缺失的条件是微不足道的。有时虽然你需要进行大量的剪切和粘贴以使其正确。

基本上,MSBuild只会维护任何给定名称定义的最后一个目标,因此找到项目导入包含您要覆盖的目标的.target文件的位置,然后放入包含覆盖的自己的.target文件导入在它之后。

例如,从Microsoft.Common.targets向“CoreBuild”目标添加条件就像这样容易,同时保持相同的行为(目标条件下面带有$(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上提交一个描述你要做什么的bug,MSBuild的人可以对这种事情做出很好的响应(随着时间的推移)。

答案 3 :(得分:1)

这取决于你想要建立的目标 如果目标是内置的并且具有依赖性(如“Build”),则无法删除依赖项 如果它是您自己的目标,您可以轻松实现它:

<Target Name="YourTargetWithDependencies" 
        DependsOnTargets="YourTargetDependencies;YourTarget">
</Target>

<Target Name="YourTarget" >
</Target>

对于 Azure云计算项目中的 CorePublish 以及任何其他可自定义的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>

答案 4 :(得分:1)

通常使用属性指定目标的依赖项,例如:

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

在这种情况下,您可以调用msbuild作为

msbuild bar.proj /p:FooDependsOn=

将该属性设置为空,因此没有依赖项。