【问题标题】:Invoke Custom MSBuild Target on Solution File在解决方案文件上调用自定义 MSBuild 目标
【发布时间】:2014-05-28 11:27:31
【问题描述】:

我有一个解决方案文件 (MySolution.sln),其中包含一个项目 (MyProject.vcxproj)。我想通过解决方案在我的项目上执行自定义目标 (MyCustomTarget)。它看起来像这样:

msbuild MySolution.sln /t:MyCustomTarget

当我执行命令时,我会收到一条错误消息:

MySolution.sln.metaproj:错误 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\

但这不是一个合适的解决方案,不灵活,容易出错并且不会自动适应解决方案文件中的更改。

【问题讨论】:

标签: msbuild project target solution


【解决方案1】:

MSBuild 15 现在会自动将自定义目标提升到解决方案 metaproj 中,因此您在解决方案上直接运行目标的初始方法现在应该可以工作了。

【讨论】:

  • 很高兴知道。 :) 不幸的是,我不再从事那个项目了,但这可能对其他人有用。
  • 这是我把它放在这里的唯一原因:)
【解决方案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 文件中,您可以 &lt;Import&gt; 将其添加到每个项目中,因此可以在一个地方完成对配置的更改。

【讨论】:

    【解决方案3】:

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

    msbuild MySolution.sln /t:MyProject:MyCustomTarget
    

    请注意,如果项目在子文件夹(解决方案文件夹)中,则需要添加文件夹名称:

    msbuild MySolution.sln /t:src\MyProject:MyCustomTarget
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2012-01-17
      • 2012-12-04
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多