如何在 Visual Studio 2015 中的每个版本上强制对 qrc 文件进行 rcc-ing?我们将资源嵌入到二进制文件中,因此如果 qml 或图像资产之类的内容发生变化,我们需要运行 rcc 以获取.cpp
当前状态的新文件。我看到了几个选项 -.qrc
在预构建事件中粗暴地触摸文件,运行一个脚本,在构建之前检查资产文件夹中的所有内容,检查时间戳并将它们与之前构建的状态进行比较。有没有更干净、更优雅的选择?
2 回答
如果您要使用 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 通过将 Pre-Build Event 添加到其生成的 Visual Studio 项目中来实现这一点,因此您也可以仅使用 Visual Studio 复制它。如果您还没有找到预构建事件部分,请右键单击所需的项目(不是解决方案),然后选择Properties
. 下Build Events
,应该有一段叫做Pre-Build Events
。类似的命令del your-files
可能就足够了。
下面链接的答案提供了其他一些不错的选择。
如何在 Visual Studio Pre-build 事件命令行中删除文件
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
文件就会被触动,然后调用正常的构建命令。