2014-09-12 47 views
2

所以我可能不會做這種正確的,但這裏有雲:維克斯收穫:同一組件/文件ID當文件在不同的文件夾

我有4個SQL Server程序集的引用一個應用

應用程序必須打擊SQL 2008和2010年

我已經得到這個工作的唯一途徑是,有我的應用程序中引用了我的SQL大會一個「通用」的路徑。然後在我的MSBuild項目中,我將2008程序集複製到「通用」文件夾並編譯我的應用程序。我再次爲2012年

我有這樣的工具\發佈\ V2008和工具\發佈\ V2010文件夾做到這一點。這些文件夾具有所有EXE和必需的DLL(包括4個sql服務器)。我對這些文件夾運行HEAT。但是,當我針對每個文件夾運行熱量,每個文件夾具有相同的目錄ID但組件不同時,我會得到2個wxs文件,每個文件都具有相同的文件(預期),但每個文件的id和文件id在2個wxs文件。

例子:

MSBuild Command: 
    <Exec Command="&quot;$(WixTools)\heat.exe&quot; dir $(DeploymentRoot)\Tools\V2008 -dr TOOLS -cg Tools2008Component -var var.Tools2008Path -gg -scom -sreg -sfrag -srd -o $(heatOutputPath)\cmp2008ToolsFrag.wxs"/>  

WXS File 
    <DirectoryRef Id="TOOLS"> 
     <Component Id="cmp04831EC1F8BB21C028A7FC875720302F" Guid="*"> 
      <File Id="fil09727A8BFD32FDCE7C743D6DD2008E7C" KeyPath="yes" Source="$(var.Tools2008Path)\AL3Util.exe" /> 
     </Component> 

MSBuild Command: 
     <Exec Command="&quot;$(WixTools)\heat.exe&quot; dir $(DeploymentRoot)\Tools\V2012 -dr TOOLS -cg Tools2012Component -var var.Tools2012Path -gg -scom -sreg -sfrag -srd -o $(heatOutputPath)\cmp2012ToolsFrag.wxs"/> 

WXS file 
    <DirectoryRef Id="TOOLS"> 
     <Component Id="cmp04831EC1F8BB21C028A7FC875720302F" Guid="*"> 
      <File Id="fil09727A8BFD32FDCE7C743D6DD2008E7C" KeyPath="yes" Source="$(var.Tools2012Path)\AL3Util.exe" /> 
     </Component> 

我怎樣才能得到每個WXS文件,具有獨特的組成部分和文件ID? 還是 - 我怎樣才能做到這一點更好:)

謝謝!

+0

我正在執行以下命令並獲得不同的ID:'heat dir c:\ temp \ Dir1 -o c:\ temp \ dir1output.wxs'。你正在使用的命令語法如何? – Marlos 2014-09-12 18:00:35

回答

5

的ID將是相同的,因爲你正在使用-srd,抑制根目錄。在這種情況下,用於生成ID的路徑將僅爲文件名,爲具有相同名稱的文件生成相同的ID。

你有兩種選擇:

1)使用轉換權當您執行熱收穫與-t文件。

2)收穫後使用XslTransform任務(.NET 4)將ID重命名爲File_2012_AL3Util和File_2008_AL3Util之一。

您可以將此XSL到您的文件。在下面的示例中,如果元素與文件名的「MyFile」和目錄ID的「MyID」匹配,則元素將被刪除。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
           xmlns:wi="http://schemas.microsoft.com/wix/2006/wi"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <!-- Matches both directory name and file name. --> 
    <!-- Matches any Component that has its @Directory with same @Id as Directory 'MyID'. --> 
    <!-- Function ends-with does not work with heat. --> 
    <xsl:template match="//wi:Component[@Directory=//wi:Directory[@Name='MyID']/@Id and substring(wi:File/@Source, string-length(wi:File/@Source) - string-length('MyFile') + 1) = 'MyFile']" /> 

</xsl:stylesheet> 
+0

我會嘗試一下 - 謝謝! – user2772596 2014-09-12 18:35:43

相關問題