Visual Studio 中的多个预建事件?

24

我按照Scott Hanselman的博客文章使用PreBuild Events来管理配置并且成功地使用它。

现在我想将我的配置拆分成几个不同的文件,所以需要在构建前再次执行该命令。问题是PreBuild事件文本都被执行为一个控制台命令。如何将其拆分为多个命令?

3个回答

45

结果发现,问题在于Scott的示例代码开头没有包含call命令。只要您不想使用不同参数多次执行.bat文件,这是可以接受的。

这个:

call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)connectionStrings.config.$(ConfigurationName)" "$(ProjectDir)connectionStrings.config"
call "$(ProjectDir)copyifnewer.bat" "$(ProjectDir)appSettings.config.$(ConfigurationName)" "$(ProjectDir)appSettings.config"

对我来说很有效。


1
在VS2008中,将多个CMD文件放在不同的行上是无效的。VS只会在构建时调用第一个脚本。我在每行前面添加了CALL,然后一切都正常工作了。 - sourcenouveau
你问为什么要使用这些 call 命令?请参见此处 - Pascal

6

我正在使用Windows 7 64位操作系统上的Visual Studio 2010。

我找到了一种更适合我的解决方案,我使用&& ^将命令链接在一起,例如,像这样编辑我的.vcxproj xml文件:

    <PreBuildEvent>
      <Command>echo "hello 1" &amp;&amp; ^
echo "hello 2" &amp;&amp; ^
echo "hello 3"</Command>
      <Message>Performaing pre-build actions ...</Message>
    </PreBuildEvent>

我已经将三个命令链接在一起。 “&&”告诉shell如果前一个命令出错就停止执行。
请注意,在.xml文件中,不能直接使用“&&”,因此必须改用“& amp;& amp;”。还要注意使用符号“^”,这是cmd shell的换行字符(类似于BASH的“\”字符)。
每个新命令必须从行首开始。使用这种方法,一个人可以连接任意数量的命令,但如果有任何错误,链中其余的命令都不会被执行。
这是我的实际用例,我正在使用Python脚本执行一些环境检查,然后将我的预编译头文件的调试文件复制到另一个子项目的目录中:
    <PreBuildEvent>
        <Command>C:\Python27\python.exe "$(SolutionDir)check_path.py" 32 &amp;&amp; ^
copy "$(SolutionDir)h1ksim_lib\vc$(PlatformToolsetVersion).pdb" "$(IntDir)" /-Y > nul</Command>
        <Message>Performaing pre-build actions ...</Message>
    </PreBuildEvent>
< p > 在复制命令中使用“> nul”可防止任何输出显示在构建窗口中,因此当它说“0 file(s) copied.”时,我的团队不会感到惊慌。

有关在子项目之间共享预编译头的参考资料,请参见:

在Visual Studio中共享预编译头文件


-1

你应该能够将命令放在单独的一行上,然后每个命令将按顺序执行。或者,一个“作弊”的方法是:

  • 创建第二个批处理文件来运行所需的新功能部分,然后创建一个父批处理文件来运行这两个组件批处理文件,并在预构建事件中运行该新批处理文件。例如:batch1.bat 修改文件1,batch2.bat 修改文件2,然后 batch3.bat 运行 batch1.bat 和 batch2.bat 。

1
它们虽然在不同的行上,但似乎被当作一个整体执行。我考虑过批处理文件的方法,但这似乎更像是一个权宜之计而非解决方案。 - Kirschstein
很奇怪。我可以提供其他建议(例如添加分号作为分隔符),但那只是在瞎猜。抱歉! - MBillock

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