【问题标题】:Import .targets file from command line in msbuild从 msbuild 中的命令行导入 .targets 文件
【发布时间】:2013-08-15 08:36:09
【问题描述】:

我目前正在使用 msbuild 构建多个项目。我对由 .targets 文件处理的构建进行了小的自定义。一种解决方案是添加 sn -p

<Import Project="MyTargets.targets"/>

到每个项目文件。但是,理想情况下,我不想接触项目文件,并且能够将此信息作为参数传递给 msbuild。这样我就可以轻松控制是否从命令行运行此自定义,并且我不必接触现有的项目文件。

这可能吗?

【问题讨论】:

    标签: command-line msbuild target


    【解决方案1】:

    您可以使用 MSBuild 4.0 轻松做到这一点(通过顶级属性 ToolsVersion="4.0" 检查您的版本):

    您可以使用多个属性在加载 Common.targets 和/或 CSharp.targets 之前和之后导入目标。

    最简单的方法是使用 2 组自我解释属性。 第一组是: $(CustomBeforeMicrosoftCommonTargets) $(CustomAfterMicrosoftCommonTargets)

    第二个:

    $(CustomBeforeMicrosoftCSharpTargets)
    $(CustomAfterMicrosoftCSharpTargets)
    

    属性名称很容易解释。

    只需通过 msbuild.exe 将完整文件名传递给任何此属性 例如

    msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets=c:\mytargets\custom.targets
    

    如果您需要导入多个文件,您可以使用其他 "ImportByWildcard(Before|After)...." 属性。但在这种情况下,您需要将更多参数传递给命令行。

    【讨论】:

    • 可以在命令行中引用宏吗?例如: /p:CustomBeforeMicrosoftCSharpTargets="$(SolutionDir)\custom.targets" ?这似乎对我不起作用。
    • 怀疑它会起作用,这个命令行不会被 msbuild 引擎处理,它会解开这些属性。您可以专门化相对于构建脚本本身路​​径的路径
    • 设置以上四个属性中的任何一个,我都无法通过/target:&lt;target&gt;让MSBuild运行导入文件的任何目标(错误:项目中不存在目标“” )。如果我设置例如InitialTargets 在导入的文件中,目标被执行。是不是不能外部引用导入的目标?
    • 嗯,您当前使用的是哪个版本的 MSBuild?上面的答案已有 5 年历史,无法回忆所有细节,自 2013 年以来情况可能会有所变化;)您能否提供一些更具体的细节或打开一个新问题并在此处参考?
    【解决方案2】:

    从 MSBuild 15.0 开始,以下两个文件会自动导入到您的构建中,以防在项目路径或根目录路径上的任何父文件夹中找到它们:

    • Directory.Build.props
    • Directory.Build.targets

    备注:一旦找到 props 或 targets 文件,MSBuild 将停止寻找父文件。

    另见:https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

    【讨论】:

      【解决方案3】:

      假设您有一个名为“Project.msbuild”的项目文件。您将添加此条件导入:

      <Import Project="$(TargetToImport)" Condition="'$(TargetToImport)' != ''" />
      

      然后将要导入的目标文件的名称作为 msbuild 属性传递:

      msbuild.exe Project.msbuild /p:TargetToImport="TargetFile.Target"
      

      【讨论】:

      • 这并不能真正解决不想更改项目文件的问题(尽管它确实意味着一旦我进行了此更改,所有其他修改都可以在项目文件之外完成)。问题实际上是在问我是否可以通过命令行有效地插入 元素。
      【解决方案4】:

      确保您使用目标文件的绝对路径并且它可以工作。
      来源:Sayed Ibrahim Hashimi - MSBuild how to execute a target after CoreCompile part 2

      msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets="c:\mytargets\custom.targets" /preprocess:out.xml
      

      使用/preprocess[:filepath] 查看导入的结果。

      您不必修改任何 csprojvbproj 文件。
      当然,它只适用于可以设置 MSBuild 属性的地方。

      【讨论】:

      • 对我来说,这确实创建了一个out.xml 文件,但它始终是空的(零字节)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2013-07-23
      • 2010-10-31
      • 1970-01-01
      相关资源
      最近更新 更多