Visual Studio中如何继承后置构建事件?

8
我在 Visual Studio 中有一个解决方案,其中包含一个共享的属性表,其中包含需要对每个项目执行的“Post-Build Event”命令 (bar)。
如何指定其他特定于项目的“Post-Build Event”?通常的“从父元素或项目默认值继承”选项缺失,我不想手动将bar添加到每个单独的项目中,因为这样很难维护。
3个回答

22

在找到这个解决方案并查看其他帖子后,我发现不可能理解VC++团队为什么会省略这个功能。

在属性页的宏中,您可以使用%(Command)宏/环境变量将上一个属性的命令包含进来。这适用于所有的构建事件。

PropertySheet1.props

copy some.dll $(OutputPath)
%(Command)

属性表2.props

copy other.dll $(OutputPath)
%(Command)

所有命令都将被执行。


2
根据这篇帖子,似乎不可能继承后构建事件。你发布了你的问题已经一段时间了,你是否找到了可行的替代方案?

根据反馈进行编辑: 一个潜在的混乱替代方案是将你的命令定义为宏:

<!-- CommandX.props -->
<PropertyGroup>
  <CommandX>bar</CommandX>
</PropertyGroup>

接着,你可以将$(CommandX)添加到项目的后期构建命令或另一个属性表中。如果$(CommandX)不存在,则会被静默忽略。

如果在另一个属性表中添加了这个宏,那么你需要导入你的CommandX属性表,以便$(CommandX)继承一个值:

<!-- Some-Other-Property-Sheet.props -->
<ImportGroup Label="PropertySheets">
  <Import Project="CommandX.props" />
</ImportGroup>

在更深入了解构建过程后,我建议使用MSBuild tasks,特别是Exec task可能会提供最可行的解决方案。


不,根据我的问题,我已经采取手动单独维护每个项目的方式。我想到的唯一解决方案(但尚未尝试实现)是通过脚本设计自己的继承结构 - 让每个项目调用相同的脚本作为其后期构建事件,但将项目名称作为变量传递,并让脚本根据需要运行其他命令。这很笨重,但至少可以将维护减少到一个文件中。 - JBentley
或者,让每个项目调用自己的脚本(通过使用MSVC内置的宏从与项目相关的位置调用脚本),并且让这些脚本递归地调用它们继承的项目中的脚本。这两种方法的主要问题是继承结构本身必须在两个地方更新(属性表和脚本),否则它们就会失去同步。 - JBentley

0

由于某些后构建事件未继承其定义的属性表,我对此产生了疑问,并最终来到这里。

我有好消息: 自Visual Studio 2013以来,预构建和后构建事件命令行具有“从父级或项目默认值继承”的选项,该选项会添加所有属性表中的事件。

(已在Visual Studio 2013和2017专业版上进行测试)


1
这很好,但并没有解决问题。一旦您向项目添加自定义后构建事件,它就会替换继承的值。您的自定义后构建步骤将代替继承的步骤运行。最初的问题是要求如何在继承的步骤之外运行自定义后构建步骤。 - foo64
对不起,我针对“通常的‘从父级或项目默认值继承’选项缺失”做了反应。 - Yamakuzure

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