Command line 从msbuild中的命令行导入.targets文件

Command line 从msbuild中的命令行导入.targets文件,command-line,msbuild,target,Command Line,Msbuild,Target,我目前正在使用msbuild生成多个项目。我有一个由.targets文件处理的构建的小定制。一种解决方案是添加代码段 <Import Project="MyTargets.targets"/> 添加到每个项目文件。但是,理想情况下,我不希望接触项目文件,并且能够将此信息作为参数传递给msbuild。通过这种方式,我可以轻松控制是否从命令行运行此自定义,并且不必接触现有的项目文件 这可能吗?假设您有一个名为“project.msbuild”的项目文件。您将添加此条件导入: <

我目前正在使用msbuild生成多个项目。我有一个由.targets文件处理的构建的小定制。一种解决方案是添加代码段

<Import Project="MyTargets.targets"/>

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


这可能吗?

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

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

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

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

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

第二点:

$(CustomBeforeMicrosoftCSharpTargets)
$(CustomAfterMicrosoftCSharpTargets)
财产名称是相当自我解释的

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


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

请确保对目标文件使用绝对路径,并且该路径可以工作。
来源:

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

您不必修改任何
csproj
vbproj
文件。

当然,它仅适用于可以设置MSBuild属性的情况。

从MSBuild 15.0开始,如果在项目路径或根目录路径上的任何父文件夹中找到以下两个文件,则会自动将它们导入到生成中:

  • Directory.Build.props
  • Directory.Build.targets
备注:找到道具或目标文件后,MSBuild将停止查找父文件


另请参见:

这并不能真正解决不想更改项目文件的问题(尽管这确实意味着一旦我进行了此更改,所有其他修改都可以在项目文件之外进行)。问题是我能否通过命令行有效地插入一个元素。你能在命令行中引用宏吗?例如:/p:CustomBeforeMocrosoftcSharpTargets=“$(SolutionDir)\custom.targets”?这似乎对我不起作用。毫无疑问,msbuild引擎没有处理此命令行,而msbuild引擎会打开这些属性。您可以指定相对于生成脚本自身路径的路径设置上述四个属性中的任何一个,我无法通过
/target:
(错误:项目中不存在目标“”)使MSBuild运行导入文件的任何目标。如果在导入的文件中设置例如
InitialTargets
,则执行目标。无法从外部引用导入的目标吗?嗯,您当前使用的MSBuild版本是什么?上面的答案是5年前的,回忆不起所有的细节,自2013年以来情况可能会有所改变;)你能提供一些更具体的细节,或者打开一个新问题并在这里引用它吗?对我来说,这确实创建了一个
out.xml
文件,但它总是空的(零字节)。
$(CustomBeforeMicrosoftCSharpTargets)
$(CustomAfterMicrosoftCSharpTargets)
msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets=c:\mytargets\custom.targets
msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets="c:\mytargets\custom.targets" /preprocess:out.xml