【问题标题】:How to force the build to be out of date, when a text file is modified?修改文本文件时,如何强制构建过期?
【发布时间】:2010-11-25 16:45:25
【问题描述】:

情景
我的项目设置了一个构建后阶段来运行一个批处理文件,该文件读取一个文本文件“version.txt”。批处理文件使用 version.txt 中的信息通过使用 this tool 的版本块注入 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 文件作为构建的输入,但实际上并没有尝试使用它。

如果我在项目中#include 来自 CPP 文件的 .txt 文件,编译器会失败,因为它显然不理解“@set”的含义。

如果我在 @set 命令周围添加 /* ... */ cmets,则批处理文件会出现一些语法错误,但最终会成功。但我认为这是一个糟糕的解决方案。

那么...你会怎么做呢?

【问题讨论】:

    标签: visual-studio visual-studio-2008 batch-file dependencies versioning


    【解决方案1】:

    这适用于 VS2005。如果您不使用它,则某些设置可能位于不同的位置或使用不同的名称。

    将文本文件添加到您的项目中,在解决方案资源管理器中右键单击它并选择“属性”。在 Configuration Properties > General 下确保该文件未从构建中排除。在自定义构建步骤 > 常规下,将现有的构建后命令作为命令行设置。确保将 .txt 文件指定为输出文件。现在 F7 应该会发现文本文件的更改并运行您的批处理文件。

    【讨论】:

    • 这会强制每次我按 F7 时运行批处理文件,无论 version.txt 文件是否已被修改。这会减慢我的构建速度,足以让我注意到它。你知道我如何只能在 version.txt 被修改后运行自定义构建步骤吗?
    • 嗯,我也一样。对于那个很抱歉。不过,我可以通过将 .txt 文件指定为输出文件来修复它。试试看?
    • OK 我已将 .txt 文件添加到自定义构建步骤的输出中。但是现在每当我按 F7 时,它都会运行构建步骤,然后修改 .txt 文件的时间戳,使其每次都运行构建步骤。我确定我在这里遗漏了一些明显的东西......这肯定不会这么难吗?!
    • 听起来 Visual Studio 现在正在按照您想要的方式工作,但是您的批处理文件导致文本文件被修改,因此 VS 认为它再次过时了。您能否更改批处理文件以将文本文件复制到 version.bat,然后在最后删除此副本?这样 version.txt 本身不会受到影响。
    • +1 因为这是您想要的路径,即使它还没有到达您想要的位置。我赞成将 version.txt 复制到使用后删除的临时 .bat 的想法。在构建步骤中更改源文件的任何属性都是有风险的,并且可能会导致某种混乱。每个步骤的源文件应被该步骤视为只读。即使它们是由其他步骤创建的。
    【解决方案2】:

    这可能太“老套”了,但这可能会奏效:

    1. 快速编写 Perl(等)脚本以检查 version.txt 是否已更新。
    2. 如果文件已被修改,请让此脚本更新与您的项目一起编译的虚拟源文件。
    3. 将脚本作为预构建事件运行。

    这样,如果脚本看到文件发生了变化,它会改变另一个,这将强制重新构建。

    Hacky,但如果你正在刮桶底,请尝试一下。

    【讨论】:

    • 是的,绝对是 hacky。我不想确定文件是否已被修改,我必须存储上次使用的文件时间或其他东西......但是跳出框框思考的好工作:)
    猜你喜欢
    • 2012-10-24
    • 2018-11-27
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2022-11-29
    • 2016-05-06
    • 1970-01-01
    相关资源
    最近更新 更多