Как HeatDirectory 2 или более раз против каталогов с теми же файлами? - PullRequest
3 голосов
/ 09 февраля 2011

Я использовал задачу HeatDirectory в нашем проекте установщика WiX в цели BeforeBuild для сбора файлов веб-приложения, которое мы развертываем в сети клиентов. Работал отлично.

Теперь я хочу развернуть второй набор файлов, который, как оказалось, является некоторой документацией, и он содержит файлы с тем же именем, которые существовали в предыдущем выводе HeatDirectory.

Я получаю следующую ошибку:

LGHT0293: Multiple files with ID 'Web.Config' exist.

Я понимаю, почему я получаю ошибку, мне интересно, как лучше ее устранить.

Вариант A :

Скопируйте все файлы в каталог и запустите их за один массовый проход.

Мне это нравится, потому что это было бы довольно легко реализовать с помощью стандартных задач MSBuild. Мне это не нравится, потому что это создаст одну массивную ComponentGroup, и если я когда-нибудь решу сделать дополнительные функции (например, не устанавливать что-либо), я не смогу.

Вариант B :

Переберите выходной файл задачи HeatDirectory и добавьте суффикс ко всем идентификаторам компонентов и идентификаторам файлов. Пример - web.config станет web.config_DocumenationFiles

Мне нравится это, потому что это чисто; то есть я могу удалить его позже или добавить в проект, в котором возникла проблема, и не добавлять его в проекты, которые этого не делают. Мне это не нравится, потому что я не уверен, какой «процесс» (или задача MSBuild) способен это сделать. Мне нужно нестандартное задание, я думаю.

Другие параметры :?

Идеи

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

Задача HeatDirectory имеет атрибут Transforms, который можно использовать для преобразования файла результатов. Вы можете создать xslt, чтобы добавить суффикс к идентификаторам компонентов.

Кроме того, тепло - расширяемое . Возможно, вы захотите создать свой собственный харвестер, который добавит суффикс к идентификаторам компонентов.

1 голос
/ 16 апреля 2014

Я вижу, что кто-то пришел и проголосовал за это три года спустя. Я подумал, что вернусь и скажу, что я все еще использую Option B, пользовательскую задачу MSBuild для решения этой проблемы.

Я сделал комментарий к другому сообщению о проблеме с более подробной информацией и подумал, что я бы переместил / скопировал бы мою реализацию здесь, если это будет полезно.

Я решил эту проблему, создав пользовательскую задачу сборки для запуска после задачи HeatDirectory, добавив суффикс к атрибуту Id.

<AddSuffixToHeatDirectory File="ReportFiles.Generated.wxs" Suffix="_r" />

Задача AddSuffixToHeatDirectory как таковая

public class AddSuffixToHeatDirectory : Task
{
    public override bool Execute()
    {
        bool result = true;

        Log.LogMessage("Opening file '{0}'.", File);
        var document = XElement.Load(File);

        var defaultNamespace = GetDefaultNamespace(document);

        AddSuffixToAttribute(document, defaultNamespace, "Component", "Id");
        AddSuffixToAttribute(document, defaultNamespace, "File", "Id");
        AddSuffixToAttribute(document, defaultNamespace, "ComponentRef", "Id");
        AddSuffixToAttribute(document, defaultNamespace, "Directory", "Id");

        var files = (from x in document.Descendants(defaultNamespace.GetName("File")) select x).ToList();

        Log.LogMessage("Saving file '{0}'.", File);
        document.Save(File);

        return result;
    }

    private void AddSuffixToAttribute(XElement xml, XNamespace defaultNamespace, string elementName, string attributeName)
    {
        var items = (from x in xml.Descendants(defaultNamespace.GetName(elementName)) select x).ToList();
        foreach (var item in items)
        {
            var attribute = item.Attribute(attributeName);
            attribute.Value = string.Format("{0}{1}", attribute.Value, Suffix);
        }
    }

    private XNamespace GetDefaultNamespace(XElement root)
    {
        // I pieced together this query from hanselman's post.
        //  http://www.hanselman.com/blog/GetNamespacesFromAnXMLDocumentWithXPathDocumentAndLINQToXML.aspx
        // 
        // Basically I'm just getting the namespace that doesn't have a localname.
        var result = root.Attributes()
                        .Where(a => a.IsNamespaceDeclaration)
                        .GroupBy(a => a.Name.Namespace == XNamespace.None ? String.Empty : a.Name.LocalName, a => XNamespace.Get(a.Value))
                        .ToDictionary(g => g.Key, g => g.First());
        return result[string.Empty];
    }

    /// <summary>
    /// File to modify.
    /// </summary>
    [Required]
    public string File { get; set; }

    /// <summary>
    /// Suffix to append.
    /// </summary>
    [Required]
    public string Suffix { get; set; }
}

Надеюсь, это поможет. Я все еще использую этот метод сегодня, и я не сделал всю работу, чтобы изучить Transform или расширение HeatDirectory.

...