在每次构建时强制 rcc-ing qrc 文件

Force rcc-ing of qrc file on each build

如何在 Visual Studio 2015 年的每个版本中强制对 qrc 文件进行 rcc-ing?我们将资源嵌入二进制文件中,因此如果 qml 或图像资产等内容发生变化,我们需要 运行 rcc 以获得当前状态的新 .cpp 文件。我看到了几个选项——在预构建事件中粗暴地触摸 .qrc 文件,运行ning 脚本在构建之前检查资产文件夹中的所有内容并检查时间戳并将它们与之前的状态进行比较建造。有没有更简洁优雅的选择?

如果您要使用 CMake,您可以添加预构建任务以从构建目录中删除 your-project-name_autogen 文件夹。这会强制 CMake 在每次构建时对 qrc 文件进行 rcc。

该命令可能类似于:

add_custom_command (TARGET your-project-name PRE_BUILD
    COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/your-project-name_autogen)

CMake 通过向其生成的 Visual Studio 项目添加预构建事件来实现此目的,因此您也可以仅使用 Visual Studio 复制它。如果您还没有找到预构建事件部分,请右键单击所需的项目(不是解决方案),然后 select Properties。在 Build Events 下,应该有一个名为 Pre-Build Events 的部分。 del your-files 这样的命令可能就足够了。

下面链接的答案提供了一些其他不错的选择。

How to delete files in Visual Studio Pre-build event command line

CMake 命令解决了我使用包含 QML 资源的 Qt qrc 文件的问题。

鉴于评论中提出的要求,我将发布我提出的解决方案。所以,在我的例子中,qrc 文件被添加到 Visual Studio 解决方案,并且有一个适当的自定义构建工具集(但这是常见的方式,应该由 VS Qt 插件设置)像这个:

我所要做的就是制作一个简单的 C# 程序,该程序读取 qrc 的内容并更新 qrc 文件的修改时间戳,如果包含的任何项目是更新的比 qrc 本身。这就是全部:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.IO;

namespace QrcValidator
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                System.Console.WriteLine("usage: QrcValidator.exe <qrc file path>");
                return;
            }
            Console.WriteLine(string.Format("Validating {0}", args[0]));
            XDocument qrcDocument = XDocument.Load(args[0]);
            var qrcFileLastWrtieTimeUtc = File.GetLastWriteTimeUtc(args[0]);
            foreach (var file in qrcDocument.Descendants("RCC").Descendants("qresource").Descendants("file"))
            {
                if (File.GetLastWriteTimeUtc(file.Value) >= qrcFileLastWrtieTimeUtc)
                {
                    Console.WriteLine("{0} is dirty, setting last write time of {1} to current UTC time", file.Value, args[0]);
                    File.SetLastWriteTimeUtc(args[0], DateTime.UtcNow);
                    Environment.Exit(0);
                }
            }
        }
    }
}

此工具将 qrc 文件作为第一个参数。所以我只是添加了调用此工具作为预构建事件,如果资源发生任何更改,则会触及 qrc 文件,并调用它的正常构建命令。