调用自定义MSBuild目标文件到解决方案文件上

5

我有一个解决方案文件(MySolution.sln),其中只有一个项目(MyProject.vcxproj)。我想通过解决方案在我的项目上执行自定义目标(MyCustomTarget)。它应该类似于这样:

msbuild MySolution.sln /t:MyCustomTarget

当我执行命令时,会得到一个错误信息:
MySolution.sln.metaproj : error MSB4057: 目标“MyCustomTarget”在项目中不存在。 [MySolution.sln]
您可以将 MyCustomTarget 替换为Microsoft.Cpp.Win32.targets中的任何标准目标(例如:ClCompile,Link)或您从MyProject.vcxproj的.targets文件中包含的任何其他目标。但它们都不起作用。
当环境变量 msbuildemitsolution 设置为1时,我可以检查生成的 MySolution.sln.metaproj 文件。底部指定了4个目标:Build,Rebuild,Clean和Publish。使用这些目标而不是 MyCustomTarget ,项目可以成功编译。另外,如果我指定项目文件而不是解决方案文件,则也可以构建:
msbuild MyProject.vcxproj /t:MyCustomTarget

但是使用这种格式,我将失去OutDir属性,需要手动设置ConfigurationPlatform,因此我只会失去拥有解决方案文件的好处。 是否有任何方法可以在我最初想要的解决方案文件中使用我的自定义目标? 据我所知,问题在于msbuild生成了这个中间项目文件(mysolution.sln.metproj),但它不会包含来自MyProject.vcxproj的导入项,包括.targets文件。难怪无法识别MyCustomTarget
我当前的解决方法是使用项目文件与msbuild一起使用,并尽量不错过解决方案文件中的任何内容。
msbuild MyProject.vcxproj /t:MyCustomTarget /p:Configuration=MyConfig;Platform=MyPlatform;OutDir=MySolution\Platform_MyConfig\

但这并不是一个合适的解决方案,它不够灵活,容易出错,并且无法自动适应解决文件中的变化。

1
你尝试过使用 before.{solutionname}.sln.targets 吗?将你的目标文件作为解决方案的一部分导入。https://dev59.com/YGMm5IYBdhLWcg3wT9qU#17712386 - jessehouwing
3个回答

4

现在,MSBuild 15会自动将自定义目标引入到解决方案的元项目中,因此您最初直接在解决方案上运行目标的方法现在应该可以正常工作。


知道这个很好。:) 不幸的是,我不再在那个项目上工作了,但这可能对其他人有用。 - Shakaron
这是我放在这里的唯一原因 :) - Martin Ullrich

2

我认为你已经回答了自己的问题。答案是否定的。在.sln.metaproj文件中没有名为“MyCustomTarget”的目标,因此MSBuild会给出该错误信息。

现在,要解决在命令行传递额外参数的问题。如果在.vcxproj文件中设置默认值,则不需要传递平台和配置。在任何标准目标文件被导入之前,在项目文件中添加以下内容:

<Platform Condition="'$(Platform)'==''">MyPlatform</Platform>
<Configuration Condition="'$(Configuration)'==''">MyConfiguration</Configuration>

配置OutDir,它在解决方案中所有项目之间共享,可以像这样完成。我假设您的解决方案结构是.sln文件位于根文件夹中,所有项目都在根目录下的子文件夹(任意深度)中或与解决方案位于同一文件夹中。如果不是这种情况,您将需要稍微调整代码以适应您的情况。

在您的项目中定义平台和配置后,立即添加此属性组:

<PropertyGroup>
    <RootFolder>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory),MySolutionName.sln))</RootFolder>
    <OutDir Condition="'$(OutDir)'==''">$(RootFolder)\$(Platform)_$(Configuration)</OutDir>
</PropertyGroup>

上面的代码遵循了您将OutDir设置为MySolution\MyPlatform_MyConfiguration的约定。

这种方法的缺点是您必须手动修改解决方案中的所有项目。但它将为您提供很多灵活性。例如,任何在所有项目之间共享的通用设置都可以提取到单个 .props 文件中,然后您可以将其<Import>到每个项目中,以便在一个地方进行配置更改。


2

为了在使用解决方案文件进行构建时使用项目文件中存在的自定义目标,请使用以下格式:

msbuild MySolution.sln /t:MyProject:MyCustomTarget

请注意,如果项目在子文件夹(解决方案文件夹)中,则需要添加文件夹名称:
msbuild MySolution.sln /t:src\MyProject:MyCustomTarget

如果项目名称包含空格或点,则会用下划线替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接