2011-08-11 13 views
4

メインの.wxsファイルと空の.wxsファイルを持つVS2010 WiXプロジェクトがあります。空の.wxsは、プロジェクトのprebuildイベントで上書きされ、heat.exeを使用してコンソールEXEからすべてを収穫します。 exeにInstallUtilフックがあり、VSセットアッププロジェクトの日にexeがサービスとしてインストールされました。WiX 3.5熱からサービスをインストールする、カスタムアクションが必要ですか?

私はWiXで<ServiceInstall>ビットを使用しようとしましたが、サービスをインストールするための実行可能ファイルやその他の要素を指定すると、メインの.wxsの.exeと熱くなると.exeの間で衝突が発生しました生成された.wxs。

サービスのインストールを行うにはカスタムアクションが最適な方法ではないと思います。そのため、XSL変換を使用してファイルを取り出そうとしています。

私のXSLは、一致する/フィルタリングされていないので、問題がなければなりません。ここでは、次のとおりです。私はこのような外観をリッピングする必要が.wxsの

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
exclude-result-prefixes="msxsl" 
    xmlns:Wix="http://schemas.microsoft.com/wix/2006/wi"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:copy> 
    </xsl:template> 

<xsl:template match=" 
     Component[File/@Source='$(var.bindir)\servicehost.exe']"/ 
</xsl:stylesheet> 

パーツ:

.... 
    <Component Id="cmpD64BE1790BFAF0F05DA37558F5D72572" Guid="{6C70DDC8-349B-4B66-A415-DE08E302C2A8}"> 
        <File Id="fil24DFDFCA765C9A8BBB8854CE66AED0E8" KeyPath="yes" Source="$(var.bindir)\servicehost.exe" /> 
       </Component> 
    .... 
<ComponentRef Id="cmpD64BE1790BFAF0F05DA37558F5D72572" /> 
    .... 

この作業を行うための最善の方法は何ですか?

ありがとうございました。

+0

ここに同様の質問:http://stackoverflow.com/questions/7906578/removingを-unit-test-dll-files-using-wix –

答えて

3

Heatを使用して収穫するファイルのステージングディレクトリを作成します。手動でServiceInstallを作成できるように、サービス.exeを個別に保管してください。

+0

サービスの出力bin \ debug dirが熱くなっています。 Heatからファイルパターンを除外する方法があることを望みます。うーん。多分、XSLを使用してexeファイルを削除する方法がありますので、私はそれを私のメインのwxsに保存できますか? – Snowy

+1

そのため、私はステージングディレクトリを作成することを提案しました。そのため、XSLルートを経由せずに、Heatが収穫しているものを制御できます。 –

+0

@ dani-carbonellは、複雑な変換とステージングディレクトリを同時に避けて、[類似の答え]を提供しました(http://stackoverflow.com/a/20197647/1811525)。 – CodeFox

6

Wix XML要素は名前空間にあるため、match値で名前空間を指定する必要があります。

私はheatによって生成されたフラグメントにServiceInstallServiceControl要素に追加するには、XSLを使って、同じ問題を解決:

<!-- Add the service install/control entries to mybinary.exe --> 
<xsl:template match="wix:Component[contains(wix:File/@Source,'mybinary.exe')]"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
     <wix:ServiceInstall Id="MyServiceInstall" DisplayName="[SERVICE_NAME]" Description="[SERVICE_DESC]" Name="MyService" Arguments="" ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes" Account="LocalSystem" /> 
     <wix:ServiceControl Id="MyServiceControl" Name="MyService" Start="install" Stop="uninstall" Remove="uninstall" /> 
    </xsl:copy> 
</xsl:template> 
+1

バイナリを正確に一致させるには(同じ名前のapp.configがある場合)、次のマッチラインを試してください: Mo0gles

関連する問題