我正在尝试使用VS2012中的WIX工具集3.7为我的WFC服务创建安装程序。所有服务都有相同的结构:
service.svc
只是链接到特定的类
<%@ ServiceHost Language="C#" Debug="true"
Service="LandwehrServices.Service.Vorlage.ServiceOption"
Factory="ServiceCreator.DigestAuthenticationHostFactory" %>
正在安装dll,但所有文件夹都包含相同的service.svc
(第一个安装的服务)文件...
这是我的Product.wxs
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="020f2a79-d085-4c05-b49d-a09300e8a144"
Name="!(loc.ProductName)"
Language="1031"
Version="1.0.0.0"
Manufacturer="!(loc.CompanyName)"
UpgradeCode="a0bbe6c8-1658-43e4-9cf8-51d6bbdf84d2">
<Package InstallerVersion="200" Compressed="yes"
Languages="!(loc.LANG)"
Manufacturer="!(loc.CompanyName)" Comments="!(loc.Comments)"
Description="!(loc.Description)" Keywords="!(loc.Keywords)"/>
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="!(loc.ProductName)">
<Directory Id="INSTALLLOCATION.Option" Name="Service.Option" />
<Directory Id="INSTALLLOCATION.Personal" Name="Service.Personal" />
<Directory Id="INSTALLLOCATION.Postbox" Name="Service.Postbox" />
</Directory>
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="!(loc.ProductName)" Level="1">
<ComponentGroupRef Id="Option_Project" />
<ComponentGroupRef Id="Personal_Project" />
<ComponentGroupRef Id="Postbox_Project" />
</Feature>
</Product>
</Wix>
BeforeBuild
.wixdproj
条目
<Target Name="BeforeBuild">
<MSBuild Projects="%(ProjectReference.FullPath)"
Targets="Package"
Properties="Configuration=$(Configuration);Platform=AnyCPU"
Condition="'%(ProjectReference.WebProject)'=='True'" />
<ItemGroup>
<LinkerBindInputPaths Include="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\" />
</ItemGroup>
<HeatDirectory OutputFile="%(ProjectReference.Filename).wxs"
Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\"
DirectoryRefId="INSTALLLOCATION.%(ProjectReference.Filename)"
ComponentGroupName="%(ProjectReference.Filename)_Project"
AutogenerateGuids="true" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true"
SuppressRootDirectory="true" ToolPath="$(WixToolPath)" Condition="'%(ProjectReference.WebProject)'=='True'" />
</Target>
有什么想法吗?这是我第一次使用WIX ......
答案 0 :(得分:1)
确定。这解决了我的问题。
强制使用命名绑定路径调用链接器
我添加了以下项目组,其中包含指向两个包的项目。
<ItemGroup>
<BindInputPaths Include="..\MyProject1\obj\Debug\Package\PackageTmp">
<BindName>MyProject1</BindName>
<InProject>false</InProject>
</BindInputPaths>
<BindInputPaths Include="..\MyProject2\obj\Debug\Package\PackageTmp">
<BindName>MyProject2</BindName>
<InProject>false</InProject>
</BindInputPaths>
</ItemGroup>
在包含LinkerBindInputPaths元素的预构建步骤中删除项目组。
在Visual Studio输出窗口中验证这一点。 Light.exe命令行现在应该具有命名绑定路径。
-b "MyProject1=D:\Projects\...\MyProject1\obj\Debug\Package\PackageTmp"
-b "MyProject2=D:\Projects\...\MyProject2\obj\Debug\Package\PackageTmp"
在收获输出中使用命名绑定路径
我试图让HeatDirectory任务生成此输出,但最后只使用XSLT转换来更新SourceDir部分以使用bindpath变量。
在通过XSLT转换进行管道传输之前,更新Wix项目以将Heat输出定向到tmp文件。
<HeatDirectory OutputFile="%(ProjectReference.Filename)-temp.wxs"
Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\"
DirectoryRefId="%(ProjectReference.Name)InstallFolder"
ComponentGroupName="%(ProjectReference.Name)_Project"
AutogenerateGuids="true"
SuppressCom="true"
SuppressFragments="true"
SuppressRegistry="true"
SuppressRootDirectory="true"
ToolPath="$(WixToolPath)"
Condition="'%(ProjectReference.WebProject)'=='True'" />
<XslTransformation XmlInputPaths="%(ProjectReference.Filename)-temp.wxs"
XslInputPath="XslTransform.xslt"
OutputPaths="%(ProjectReference.Filename).wxs"
Condition="'%(ProjectReference.WebProject)'=='True'" />
将XSLT转换包含到Wix项目中(XslTransform.xslt)
<?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"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@Source['SourceDir']" >
<xsl:attribute name="Source">
<xsl:variable name="projectName">
<xsl:value-of select="/wix:Wix/wix:Fragment/wix:ComponentGroup/@Id"/>
</xsl:variable>
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="." />
<xsl:with-param name="replace" select="'SourceDir'" />
<xsl:with-param name="by" select="concat('!(bindpath.',$projectName,')')" />
</xsl:call-template>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
然后,Heat输出应使用ComponentGroup名称作为绑定路径变量。
<Component Id="..." Guid="*">
<File Id="..." KeyPath="yes" Source="!(bindpath.MyProject1)\Default.aspx" />
</Component>
一旦建成,我在Orca验证了MSI。在修复之前Orca列出了两个版本的文件都具有相同的字节大小。现在它列出了两个版本的正确尺寸。
答案 1 :(得分:0)
我目前有完全相同的问题。我相信它是由链接器(Light)绑定路径引起的。他们将两个打包的输出文件夹合并在一起。查看VS输出中的链接器命令行,它使用-b标志指定绑定路径。当有多条路径时,我认为它应该使用命名路径。
http://wixtoolset.org/documentation/manual/v3/howtos/general/specifying_source_files.html
C:\Program Files (x86)\WiX Toolset v3.7\bin\Light.exe
-out "D:\Projects\...\Setup.msi"
-pdbout "D:\Projects\...\Setup.wixpdb"
-b "D:\Projects\...\MyProject1\obj\Debug\Package\PackageTmp\\"
-b "D:\Projects\...\MyProject2\obj\Debug\Package\PackageTmp\\"
-cultures:en-us -ext "C:\Program Files (x86)\WiX Toolset v3.7\bin\\WixUtilExtension.dll"
-ext "C:\Program Files (x86)\WiX Toolset v3.7\bin\\WixIIsExtension.dll"
-ext "C:\Program Files (x86)\WiX Toolset v3.7\bin\\WixUIExtension.dll"
-loc WebAppInstallDlg_en-us.wxl -contentsfile obj\Debug\Setup.wixproj.BindContentsFileListen-us.txt
-outputsfile obj\Debug\Setup.wixproj.BindOutputsFileListen-us.txt
-builtoutputsfile obj\Debug\Setup.wixproj.BindBuiltOutputsFileListen-us.txt
-wixprojectfile "D:\Projects\...\Setup.wixproj" obj\Debug\MyProject1.wixobj obj\Debug\MyProject2.wixobj obj\Debug\SetupUI.wixobj obj\Debug\Setup.wixobj
我认为解决方案是使用命名绑定路径。但是,我没有设法在预构建步骤中找到指定命名绑定路径的方法。我的预构建步骤与您的相同,所以我试图弄清楚如何将LinkerBindInputPaths部分修改为使用的名称,如下所示。
<File Source="!(bindpath.foo)bar\baz.txt" />
<File Source="!(bindpath.bar)baz\foo.txt" />
light -b foo=C:\foo\ -b bar=C:\bar\ -b foo=D:\
安迪。