2011-02-09 5 views
3

BeforeBuildターゲットのWiXインストーラプロジェクトでHeatDirectoryタスクを使用して、クライアントネットワークにデプロイするWebアプリケーションのファイルを収穫しました。素晴らしい仕事をしています。同じファイルを持つディレクトリに対してHeatDirectoryを2回以上行う方法?

これでドキュメントのようになり、以前のHeatDirectory出力に存在するものと同じ名前のファイルが2番目のファイルセットを展開するようになりました。

私は次のエラーを取得する:

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

私はエラーを取得していますなぜ、私はそれを解決する最善の方法を思ったんだけど理解しています。

オプション

がディレクトリにすべてのファイルをコピーし、1回の大規模なパスでそれらに熱を実行します。

在庫MSBuildタスクを使用して実装するのがかなり簡単なので、私はこれが好きです。私はそれが1つの大規模なComponentGroupを作成するので、私はそれを嫌い、私はこれまで(何かをインストールしないように)オプション機能を作ることに決めた場合、私はできません。

オプションB

HeatDirectoryタスクの出力ファイルを反復し、すべてのコンポーネントのIDに接尾辞を付加し、同上のファイル。例 - web.configはweb.config_DocumenationFilesになります

私はこれがきれいだからこんな感じです。つまり、後で削除したり、問題が発生していないプロジェクトに追加したりすることはできません。私は「プロセス」(またはMSBuildタスク)がこれを実行できるかどうかわからないため、嫌いです。私は思っているカスタムタスクが必要です。

その他のオプション:?

アイデア?

答えて

1

私は誰かがこの3年後に来てupvoted参照してください参照してください。私は戻ってきて、問題を解決するためにカスタムMSBuildタスクであるオプションBをまだ使用していると述べました。

詳細についてはa comment on another postを作成しました。これは役立つ場合には、私の実装をここに移動/コピーすると考えました。

私は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を拡張するために足取りをしていません。

4

HeatDirectoryタスクには、結果ファイルを変換するために使用できるTransforms属性があります。 xsltを作成して、接尾辞をコンポーネントIDに追加することができます。

また、熱はextensibleです。独自のハーベスタを作成して、コンポーネントIDに接尾辞を追加することができます。

+0

+1オプションBとAaronの回答 –

+0

私はこのアイデアAaronが好きです。私は質問したので、カスタムMSBuildタスクを作成してWiXフラグメントファイルを修正し、接尾辞を追加しましたが、ビルドマシンとそのプロジェクトを使用する開発者マシンにカスタムMSBuildタスクをインストールする必要があります。最初にTransformsとXSLTを見ていきます。 –