29

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

4

5 回答 5

57

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

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

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

MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build
于 2011-11-14T20:05:58.060 回答
16

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

<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />
于 2011-03-03T05:36:57.027 回答
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 上提交一个错误来描述您正在尝试做什么,MSBuild 人员可能会对这类事情做出相当大的反应(随着时间的推移)。

于 2011-03-02T15:46:02.730 回答
1

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

<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>
于 2011-02-28T07:56:14.630 回答
1

通常一个目标的依赖是用一个属性来指定的,例如:

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

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

msbuild bar.proj /p:FooDependsOn=

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

于 2011-02-28T19:44:31.917 回答