【问题标题】:Inherit Parent MsBuild file继承父 MsBuild 文件
【发布时间】:2012-02-28 11:29:04
【问题描述】:

我的项目结构如下所示:

父母 -- 儿童项目1 -- 儿童项目2 -- ChildProjects3

我在每个 ChildProjects 节点下都有一个 msbuild 文件,用于构建相关项目、创建 zip 文件、在 subversion 中标记它们等

但是,这种逻辑大部分在 ChildProject 之间是通用的。我想知道是否可以将这个通用逻辑重构为位于父级的另一个 msbuild 文件中并让每个子级继承它?

对此的任何想法表示赞赏。

【问题讨论】:

    标签: msbuild


    【解决方案1】:

    您可以使用以下语法将通用目标放在您包含的文件中,您还将在您的 proj 文件中看到它:

    <Import Project="path to file.targets"/>
    

    注意事项:

    • 约定是使用 .targets 扩展名,但这并不重要。
    • 导入的位置很重要,具体取决于您是否希望能够覆盖导入目标文件中的属性或目标。
    • 目标与方法不同,您不能多次调用它们,但可以影响调用它们的顺序。
    • 如果您需要多次调用的可重用块,请创建自定义任务库,但请先查看MSBuildExtensionPack,看看它是否有您想要的。

    调用目标

    关于CallTarget的问题。 CallTarget 将以与DependsOnTargetsBeforeTargetsAfterTargets 相同的方式调用指定的目标。仅当目标尚未运行时才会运行。请参阅以下示例:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Foo">
    
      <Target Name="Foo" DependsOnTargets="Bar"> 
        <Message Text="Foo" />
        <CallTarget Targets="Bar" />
        <CallTarget Targets="Bar" />
      </Target>
    
      <Target Name="Bar" AfterTargets="Foo" BeforeTargets="Foo">
        <Message Text="Bar" />
      </Target>
    
    </Project>
    

    这将输出以下内容:

    Microsoft (R) Build Engine version 4.0.30319.17929
    [Microsoft .NET Framework, version 4.0.30319.18449]
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    Build started 24/02/2014 12:06:59.
    Project "D:\Dev\Test.proj" on node 1 (default targets).
    Bar:
      Bar
    Foo:
      Foo
    Done Building Project "D:\Dev\Test.proj" (default targets).
    
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:00.69
    

    【讨论】:

    • 至于第三点,CallTargetMSBuild 任务不允许明确地多次运行目标吗?它不是那么有用,也不是很方便,但这种可能性是存在的。见即blogs.msdn.com/b/manishagarwal/archive/2005/11/29/497835.aspx
    • @quetzalcoatl CallTarget 不这样做,请参阅我的更新。通过调用 MSBuild 而不是清洁将起作用。 .Net 4.5 中的另一种方法是嵌入自定义任务。 msdn.microsoft.com/en-us/library/dd723643.aspx
    • 对,CallTarget 确实过滤了它。我忘记了 CallTarget 不能传递额外的Properties。我更专注于完整的 MSBuild 任务,它的“属性”属性会导致产生新的上下文,因此它们可以多次运行任何目标(&lt;MSBuild Projects="$(MSBuildProjectFile)" Targets="Bar" Properties="___uniq_ctx=$([System.Guid]::NewGuid())" /&gt; 并且克隆会攻击!)。但当然,它的使用远非 CallTarget 的简单性(更不用说将输入/输出传入和传出它的方式..)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多