【问题标题】:Build MSBuild target without dependencies构建没有依赖项的 MSBuild 目标
【发布时间】:2011-02-28 01:05:31
【问题描述】:

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

【问题讨论】:

    标签: msbuild msbuild-4.0


    【解决方案1】:

    我想重申@EMP 的解决方案(由于我的名声不佳,我无法投票支持他)。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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 人员可能会对这类事情非常敏感(随着时间的推移)。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 它是 .ccproj 项目的 CorePublish 目标。当然,我可以手动在内部做任何事情,我只是想知道是否有更好的方法。
          【解决方案5】:

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

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

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

          msbuild bar.proj /p:FooDependsOn=
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-30
            • 2010-11-25
            • 2019-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多