如何在Visual Studio 2015中强制每个构建的qrc文件的rcc-ing?我们将资源嵌入到二进制文件中,因此如果像qml或图像资源这样的内容发生更改,我们需要运行rcc来获取当前状态的新.cpp
文件。我看到了几个选项 - 在预构建事件中粗暴地触摸.qrc
文件,运行一个脚本,在构建之前检查资产文件夹中的所有内容并检查时间戳并将它们与之前构建的状态进行比较。是否有更清洁,更优雅的选择?
答案 0 :(得分:0)
如果要使用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复制它。如果尚未找到预构建事件部分,请右键单击所需的项目(不是解决方案),然后选择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文件的解决方案。
答案 1 :(得分:0)
由于评论中要求这样做,因此我正在发布提出的解决方案。因此,在我的情况下,qrc
文件已添加到Visual Studio解决方案中,并具有适当的“自定义生成工具”集(但这是常见的方式,应由VS Qt插件设置),如下所示:< / p>
我要做的就是编写一个简单的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
文件,并调用其正常的构建命令。