Hy大家, 我正在使用Wix with Heat和XslTransform文件。 我想使用创建的UI对话框自定义我的App.config connectionString。因此,我使用如下的Xsl Transformation来添加XmlFile副本:
<xsl:template match="wix:Component[wix:File[@Source='$(var.SourceDir)\App.config']]">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
<util:XmlFile Id="UpdateBaseAddress"
Action="setValue"
File="[I want to put here my auto generated ID for the App.config File Component]"
SelectionLanguage="XPath"
Permanent="yes"
ElementPath="/configuration/connectionStrings/"
Name="connectionString" Value="[DatabaseConnectionString]" >
</util:XmlFile>
</xsl:copy>
</xsl:template>
我尝试了很多没有成功的方法。您是否有如何将匹配的文件ID设置为我的“文件”属性? 提前谢谢。
答案 0 :(得分:0)
您无需在此处放置组件ID。 File
属性需要物理文件的路径,而不是MSI组件ID。以下是如何实现类似功能的WiX片段(虽然不是XmlFile
,而是XmlConfig
元素):
<Component Id="ConnectionStringChanges" Guid="{GUID-GOES-HERE}" Directory="App_Config">
<CreateFolder/>
<Condition>NOT Installed</Condition>
<util:XmlConfig Id="ConnectionStringChange" ElementPath="connectionStrings/add[\[]@name='core'[\]]"
File="[!ConnectionStrings.config]" Name="connectionString" Action="create" Node="value" On="install"
PreserveModifiedDate="yes" Value="user id=[SQL_SERVER_CONFIG_USER];password=[SQL_SERVER_CONFIG_PASSWORD];Data Source=[SQL_SERVER];Database=[DBPREFIX]Core_DB" />
</Component>
这里需要注意的事情:
如果您将Directory
组件嵌套在右<Component>
元素下,则ConnectionStringChanges
元素的<Directory>
属性可以省略。但是,如果使用Heat自动生成目录结构,则可以使用此XSL代码段将App_Config
文件夹的自动生成ID替换为自定义ID:
<xsl:template match="wix:DirectoryRef/wix:Directory[@Name='App_Config']">
<xsl:element name="Directory" xmlns="http://schemas.microsoft.com/wix/2006/wi">
<xsl:attribute name="Id">App_Config</xsl:attribute>
<xsl:attribute name="Name">
<xsl:value-of select="@Name"/>
</xsl:attribute>
<xsl:apply-templates />
</xsl:element>
只要ConnectionStrings.config
文件声明也是自动生成的,您应该应用类似的技巧来引用\[!ConnectionStrings.config\]
syntax文件:
<xsl:template match="wix:DirectoryRef/wix:Directory[@Name='App_Config']/wix:Component[wix:File[@Source='$(var.Source)\App_Config\ConnectionStrings.config']]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="NeverOverwrite">yes</xsl:attribute>
<xsl:element name="File" xmlns="http://schemas.microsoft.com/wix/2006/wi">
<xsl:attribute name="Id">ConnectionStrings.config</xsl:attribute>
<xsl:copy-of select="wix:File/@KeyPath | wix:File/@Source"/>
</xsl:element>
</xsl:copy>
希望这有帮助。