2013-11-28 3 views
1

В моем проекте есть несколько модулей. Исходные файлы для них генерируются heatdirectory.HeatDirectory componentid duplicated

<HeatDirectory DirectoryRefId="ServerAdminService" OutputFile="Source\ServerAdminServiceSource.wxs" Transforms="Filter.xsl" Directory="..\..\Server\ServerServiceManager\bin\Debug\" PreprocessorVariable="var.ServerAdminServicePath" ComponentGroupName="ServerAdminServiceGroup" ToolPath="$(WixToolPath)" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" AutoGenerateGuids="true" GenerateGuidsNow="false"> 
</HeatDirectory> 
<HeatDirectory DirectoryRefId="ServerAdminService" OutputFile="Source\ServerAdminClientSource.wxs" Transforms="Filter.xsl" Directory="..\Setup\C24.ServerAdmin.UI\bin\Debug\" PreprocessorVariable="var.ServerAdminClientPath" ComponentGroupName="ServerAdminClientGroup" ToolPath="$(WixToolPath)" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" AutoGenerateGuids="true" GenerateGuidsNow="false"> 
</HeatDirectory> 

Это нормально работает. Мне нужно установить их в один каталог. Но они используют несколько библиотек, которые представлены в обоих модулях, и после генерации исходных файлов состоят из компонента с дублирующимся идентификатором. На самом деле я не знаю, что делать. У кого-то есть идея?

ответ

2

У меня был exact same issue.

Я решил это, создав задачу пользовательской сборки для запуска после задачи 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.

+0

+1 для кода. Спасибо за это. Я тоже нахожу это намного проще, чем создание xslt-преобразований, которые сложно кодировать. –