当文本文件被修改时,如何强制重新构建并使其过时?

4

情景
我的项目设置了一个后构建阶段来运行一个批处理文件,该文件读取一个名为“version.txt”的文本文件。批处理文件使用version.txt中的信息,使用这个工具将DLL注入版本块。

version.txt包含在我的项目中,以便轻松修改。它看起来有点像这样:

@set #Description="TankFace Utility Library"
@set #FileVersion="0.1.2.0"
@set #Comments=""

基本上,批处理文件将此文件重命名为version.bat,调用它,然后在之后将其重新命名为version.txt。
问题是,当我修改version.txt(例如递增文件版本)并按F7键时,构建不会被视为过期,因此不会执行后置构建步骤,因此DLL的版本不会更新。
我真的想将.txt文件作为构建的输入包含在内,但没有任何东西实际上尝试使用它。
如果我从项目中的CPP文件中#include .txt文件,则编译器会失败,因为显然不理解“@set”表示什么。
如果我在@set命令周围添加/*...*/注释,则批处理文件会出现一些语法错误,但最终成功。但我认为这是一个较差的解决方案。
那么...你会怎么做呢?
2个回答

1

这个方法适用于VS2005。如果你不是使用它,一些设置可能在不同的位置或者有不同的名称。

将文本文件添加到你的项目中,在解决方案资源管理器中右键点击该文件并选择“属性”。在“配置属性”>“常规”下,确保该文件没有被排除在构建之外。在“自定义生成步骤”>“常规”下,将现有的后期生成命令作为“命令行”设置。确保你指定了你的.txt文件作为输出文件。现在,F7应该能够检测到文本文件的更改并运行你的批处理文件。


这会导致批处理文件每次按F7键时都被运行,而不管版本.txt文件是否已被修改。这会减慢我的编译速度,足以引起我的注意。你知道我如何在version.txt被修改时才运行自定义构建步骤吗? - demoncodemonkey
嗯,我也是一样的问题。对此感到抱歉。不过,我成功解决了这个问题,方法是将.txt文件指定为输出文件。你可以试试这个方法吗? - Charles Anderson
好的,我已经将 .txt 文件添加到自定义生成步骤的输出中。但现在每当我按下 F7 键时,它都会运行生成步骤,然后修改 .txt 文件的时间戳,导致每次都运行生成步骤。我确定我在这里漏掉了一些显而易见的东西...... 这肯定不应该那么难吧?! - demoncodemonkey
1
听起来Visual Studio现在正在按照您的要求工作,但是您的批处理文件会导致文本文件被修改,因此VS认为它立即又过时了。您能否更改批处理文件,将文本文件复制到version.bat中,然后在最后删除此副本?这样version.txt本身就不会受到影响。 - Charles Anderson
+1 是因为这是你想要走的道路,即使它还没有完全到达你想要的地方。我赞同将 version.txt 复制到一个临时的 .bat 文件中,并在使用后删除它的想法。在构建步骤中更改源文件的任何属性都是有风险的,很可能会导致某种混乱。每个步骤的源文件都应该被视为只读文件,即使它们是由其他步骤创建的。 - RBerteig

0
这可能有点"hacky",但也许可以这么做:
  1. 编写一个快速的Perl(或其他)脚本来检查version.txt是否已经更新。
  2. 如果文件已被修改,让该脚本更新一个与您的项目一起编译的虚拟源文件。
  3. 将该脚本作为预构建事件运行。
这样,如果脚本发现文件已更改,它将更改另一个文件,从而强制重新构建。
有点hacky,但是如果你已经没有更好的办法了,可以试试看。

是的,绝对是hacky的。我不喜欢要去判断文件是否被修改过,我得存储上一次使用的文件时间或者其他什么...但是很棒,因为你有独特的思路 :) - demoncodemonkey

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