2014-02-21 123 views
1

我使用heat.exe收穫調試(或釋放)在生成後事件中使用這個腳本我的Visual Studio項目的目錄中創建一個WiX的安裝程序得到一個安裝有兩個特點:兩個Visual Studio項目

  1. 項目一

  2. B項目

的問題是,這兩個項目是指在同一個DLL(xyz.dll),因此,無論是收穫的過程,此文件具有相同的ID創建一個組件。


編輯

這是收穫版本目錄後,我的輸出文件。

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="INSTALLFOLDER"> 
      <Directory Id="dir325E6775ACBC3561D5CA2F51CFCCC7E8" Name="WixDemoFeature1"> 
       <Component Id="cmp22AE0957A805CEDAC8D05EF04AE18D5E" Guid="*"> 
        <File Id="fil9EDCA091AB8E6440E9D83A815255C794" KeyPath="yes" Source="$(var.WixDemoFeature1.TargetDir)\xyz.dll" /> 
       </Component> 
       <Component Id="cmpFCBDB8083076AA83E1B67540ADFECC9D" Guid="*"> 
        <File Id="filAA36C3D42B58D430C889BE47087CA911" KeyPath="yes" Source="$(var.WixDemoFeature1.TargetDir)\WixDemoFeature1.exe" /> 
       </Component> 
       <Component Id="cmp8BCDCA87324BD346D955DDB4318E80BD" Guid="*"> 
        <File Id="fil69700DBD0795710A0AE5DC17574128D5" KeyPath="yes" Source="$(var.WixDemoFeature1.TargetDir)\WixDemoFeature1.exe.config" /> 
       </Component> 
      </Directory> 
     </DirectoryRef> 
    </Fragment> 
    <Fragment> 
     <ComponentGroup Id="WixDemoFeature1Binaries"> 
      <ComponentRef Id="cmp22AE0957A805CEDAC8D05EF04AE18D5E" /> 
      <ComponentRef Id="cmpE0CAA29B7BB706D56252E85F7C1DDD0A" /> 
      <ComponentRef Id="cmp8BCDCA87324BD346D955DDB4318E80BD" /> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="INSTALLFOLDER"> 
      <Directory Id="dir325E6775ACBC3561D5CA2F51CFCCC7E8" Name="WixDemoFeature2"> 
       <Component Id="cmp22AE0957A805CEDAC8D05EF04AE18D5E" Guid="*"> 
        <File Id="fil9EDCA091AB8E6440E9D83A815255C794" KeyPath="yes" Source="$(var.WixDemoFeature2.TargetDir)\xyz.dll" /> 
       </Component> 
       <Component Id="cmpE0CAA29B7BB706D56252E85F7C1DDD0A" Guid="*"> 
        <File Id="fil3A3B754D2B216E86025902C3A826545D" KeyPath="yes" Source="$(var.WixDemoFeature2.TargetDir)\WixDemoFeature2.exe" /> 
       </Component> 
       <Component Id="cmpFB159630D6E1604557E20776A46EB6B3" Guid="*"> 
        <File Id="fil060CF132A168E46D3C4C1C24CA1AEFF4" KeyPath="yes" Source="$(var.WixDemoFeature2.TargetDir)\WixDemoFeature2.exe.config" /> 
       </Component> 
      </Directory> 
     </DirectoryRef> 
    </Fragment> 
    <Fragment> 
     <ComponentGroup Id="WixDemoFeature2Binaries"> 
      <ComponentRef Id="cmp22AE0957A805CEDAC8D05EF04AE18D5E" /> 
      <ComponentRef Id="cmpFCBDB8083076AA83E1B67540ADFECC9D" /> 
      <ComponentRef Id="cmpFB159630D6E1604557E20776A46EB6B3" /> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

這兩個XML有分量 「xyz.dll」 同一個ID,所以我不能在我的Product.wxs同時使用 「WixDemoFeature1Binaries」 和 「WixDemoFeature2Binaries」。

我想獲得這些來代替:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="INSTALLFOLDER"> 
      <Directory Id="dir325E6775ACBC3561D5CA2F51CFCCC7E8" Name="WixDemoFeature1"> 
       <Component Id="cmp_WixDemoFeature1.xyz.dll" Guid="*"> 
        <File Id="fil_WixDemoFeature1.xyz.dll" KeyPath="yes" Source="$(var.WixDemoFeature1.TargetDir)\xyz.dll" /> 
       </Component> 
       <Component Id="cmp_WixDemoFeature1.WixDemoFeature1.exe" Guid="*"> 
        <File Id="fil_WixDemoFeature1.WixDemoFeature1.exe" KeyPath="yes" Source="$(var.WixDemoFeature1.TargetDir)\WixDemoFeature1.exe" /> 
       </Component> 
       <Component Id="cmp_WixDemoFeature1.WixDemoFeature1.exe.config" Guid="*"> 
        <File Id="fil_WixDemoFeature1.WixDemoFeature1.exe.config" KeyPath="yes" Source="$(var.WixDemoFeature1.TargetDir)\WixDemoFeature1.exe.config" /> 
       </Component> 
      </Directory> 
     </DirectoryRef> 
    </Fragment> 
    <Fragment> 
     <ComponentGroup Id="WixDemoFeature1Binaries"> 
      <ComponentRef Id="cmp_WixDemoFeature1.xyz.dll" /> 
      <ComponentRef Id="cmp_WixDemoFeature1.WixDemoFeature1.exe" /> 
      <ComponentRef Id="cmp_WixDemoFeature1.WixDemoFeature1.exe.config" /> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="INSTALLFOLDER"> 
      <Directory Id="dir325E6775ACBC3561D5CA2F51CFCCC7E8" Name="WixDemoFeature2"> 
       <Component Id="cmp_WixDemoFeature2.xyz.dll" Guid="*"> 
        <File Id="fil_WixDemoFeature2.xyz.dll" KeyPath="yes" Source="$(var.WixDemoFeature2.TargetDir)\xyz.dll" /> 
       </Component> 
       <Component Id="cmp_WixDemoFeature2.WixDemoFeature2.exe" Guid="*"> 
        <File Id="fil_WixDemoFeature2.WixDemoFeature2.exe" KeyPath="yes" Source="$(var.WixDemoFeature2.TargetDir)\WixDemoFeature2.exe" /> 
       </Component> 
       <Component Id="cmp_WixDemoFeature2.WixDemoFeature2.exe.config" Guid="*"> 
        <File Id="fil_WixDemoFeature2.WixDemoFeature2.exe.config" KeyPath="yes" Source="$(var.WixDemoFeature2.TargetDir)\WixDemoFeature2.exe.config" /> 
       </Component> 
      </Directory> 
     </DirectoryRef> 
    </Fragment> 
    <Fragment> 
     <ComponentGroup Id="WixDemoFeature2Binaries"> 
      <ComponentRef Id="cmp_WixDemoFeature2.xyz.dll" /> 
      <ComponentRef Id="cmp_WixDemoFeature2.WixDemoFeature2.exe" /> 
      <ComponentRef Id="cmp_WixDemoFeature2.WixDemoFeature2.exe.config" /> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

我怎樣才能改變這種行爲?

回答

0

目標目錄設計用於在開發人員機器上進行調試,而不是將文件收集到包中。

是因爲它可能會,你有幾個選項,包括:

  • 熱火接受一個XSL轉換應用它發出.wxs文件之前。使用XSL,您可以過濾出您不需要的Component和ComponentRef元素。
  • 在WiXSetup中使用項目A和項目B的project reference,在其輸出中使用harvest。然後,您必須單獨收集xyz.dll或手動爲其編寫組件。手動創建兩個特徵並在兩個參考中引用xyz組件。 (我假設WiXSetup是從WiX安裝項目模板創建的Visual Studio項目。)
  • 使用MSBuild的Copy task來創建您的包佈局並收穫。複製任務可以創建硬鏈接而不是實際複製。 (幾乎所有類型的Visual Studio項目都是MSBuild項目。)

的更新問題,一個簡單的XSLT:

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

    <!-- Preserving the order of attributes only for aesthetic reasons --> 

    <xsl:template match="//wix:Component"> 
    <xsl:variable name="source" select="wix:File/@Source" /> 
    <xsl:variable 
     name="baseId" 
     select="concat(substring-before(substring-after($source, '$(var.'),'.TargetDir)'), 
       concat('.', substring-after($source,'\')))" /> 
    <Component> 
     <xsl:attribute name="Id"> 
     <xsl:value-of select="concat('cmp_', $baseId)"/> 
     </xsl:attribute> 
     <xsl:attribute name="Guid">*</xsl:attribute> 
     <File> 
     <xsl:attribute name="Id"> 
      <xsl:value-of select="concat('fil_', $baseId)"/> 
     </xsl:attribute> 
     <xsl:attribute name="KeyPath">yes</xsl:attribute> 
     <xsl:attribute name="Source"> 
      <xsl:value-of select="wix:File/@Source"/> 
     </xsl:attribute> 
     </File> 
    </Component> 
    </xsl:template> 

    <xsl:template match="//wix:ComponentRef"> 
    <!-- ComponentRef nodes are interleaved with text() nodes. Want positions 2, 4, 6, ... --> 
    <xsl:variable name="index" select="(position() - 1) div 2" /> 
    <xsl:variable name="source" select="//wix:Component[$index]/wix:File/@Source" /> 
    <xsl:variable 
     name="baseId" 
     select="concat(substring-before(substring-after($source, '$(var.'),'.TargetDir)'), 
       concat('.', substring-after($source,'\')))" /> 
    <ComponentRef> 
     <xsl:attribute name="Id"> 
     <xsl:value-of select="concat('cmp_', $baseId)"/> 
     </xsl:attribute> 
    </ComponentRef> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝你,我怎樣才能獲得使用XSLT我的目標?再次感謝你。 – workat

+0

Stack Overflow不是要求代碼的地方,但我無法抗拒[kata](http://en.wikipedia.org/wiki/Kata_(編程))。下次會更好。 –

相關問題