Принудительная запись файла qrc при каждой сборке

Как заставить rcc-файл qrc на каждой сборке в Visual Studio 2015? Мы встраиваем ресурсы в бинарный файл, поэтому если что-то вроде qml или ресурсов изображений изменяется, нам нужно запустить rcc, чтобы получить новый .cpp файл для текущего состояния. Я вижу несколько вариантов — жестоко трогать .qrc файл в событии перед сборкой, запуск сценария, который проверяет все в папке ресурсов перед сборкой, проверяет временные метки и сравнивает их с состоянием в предыдущей сборке. Есть ли более чистые и элегантные варианты?

1

Решение

Если бы вы использовали CMake, вы могли бы добавить задачу перед сборкой, чтобы удалить your-project-name_autogen папка из каталога сборки. Это заставляет CMake перезаписывать файл qrc при каждой сборке.

Команда может выглядеть примерно так:

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 в свой сгенерированный проект Visual Studio, так что вы также можете реплицировать его только с Visual Studio. Если вы еще не нашли раздел событий предварительной сборки, щелкните правой кнопкой мыши нужный проект (не решение) и выберите Properties, Под Build Eventsдолжен быть раздел под названием Pre-Build Events, Команда как del your-files вероятно, будет достаточно.

Ответ, приведенный ниже, дал некоторые другие достойные варианты.

Как удалить файлы в Visual Studio Предварительная сборка событий командной строки

Команда CMake была решением моих проблем с файлом Qt qrc, содержащим ресурсы QML.

0

Другие решения

Поскольку это было запрошено в комментариях, я публикую решение, которое мне пришло в голову. Итак, в моем случае 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 файл затронут, и это нормальная команда сборки.

0

По вопросам рекламы [email protected]