我的第一个问题是,我应该努力让编译器使用自动生成的 guid 吗?
我正在尝试使用 WiX 为网站创建安装程序。请原谅我的无知,这是我的第一个 WiX 项目。我正在关注这篇文章:
http://blog.bartdemeyer.be/2013/10/create-an-installer-for-website-with-wix-part-1/
该过程使用 msbuild 调用多个 WiX 工具以最终创建 MSI。该示例在调用 heat 时使用“Generate guids now”(“-gg”开关):
<Target Name="Harvest">
<!-- Harvest all content of published result -->
<Exec
Command='"$(WiX)bin\heat.exe" dir $(Publish) -dr INSTALLFOLDER -ke -srd -cg MgrWebComponents -var var.publishDir -gg -out $(WebSiteContentCode)'
ContinueOnError="false"
WorkingDirectory="." />
</Target>
Run Code Online (Sandbox Code Playgroud)
我在别处阅读最佳做法是使用自动生成的 guid(-ag 开关)来确保正确安装产品更新。我注意到每次运行加热时 guid 都会发生变化。
<Fragment>
<ComponentGroup Id="MgrWebComponents">
<Component Id="cmp56294569B275493319100C26538BA16C" Directory="INSTALLFOLDER" Guid="{A43DA07B-C4CD-4FE0-AC09-EEA693AB2BA7}">
<File Id="fil93D55732EC03C2B809F21B9423BF5550" KeyPath="yes" Source="$(var.publishDir)\BrandImageService.ashx" />
</Component>
<Component Id="cmp6BD39B2D572EA73C29A81AE5D1C3F0C4" Directory="INSTALLFOLDER" Guid="{99B7B916-AEC0-4EE9-B17F-E7B325E93A4D}">
<File Id="filE861424851E26D456D43F5D1855B3E7B" KeyPath="yes" Source="$(var.publishDir)\Dashboard.aspx" />
</Component>
...
Run Code Online (Sandbox Code Playgroud)
如果我应该使用自动生成的 guid,我需要让编译器正常工作。我在编译时尝试使用自动生成的 guid 时,每个文件都会出错。
LGHT0231:组件“cmp2BE6B5C092821452E1438D39A5110DDB”的密钥文件的路径为“TARGETDIR\inetpub\manager\tools\toolshome.aspx”。由于此路径不是以标准目录之一(如 ProgramFilesFolder)为根的,因此该组件不符合自动生成 guid 的标准。(如果路径包含可能的标准目录,例如在 ProgramFilesFolder 下嵌套名称为“Common Files”的目录,也可能发生此错误。)
我的目录片段是:
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INETPUB" Name="Inetpub">
<Directory Id="INSTALLFOLDER" Name="Manager" />
</Directory>
</Directory>
</Fragment>
Run Code Online (Sandbox Code Playgroud)
产生的热量片段看起来像:
<Fragment>
<ComponentGroup Id="MgrWebComponents">
<Component Id="cmp56294569B275493319100C26538BA16C" Directory="INSTALLFOLDER" Guid="*">
<File Id="fil93D55732EC03C2B809F21B9423BF5550" KeyPath="yes" Source="$(var.publishDir)\BrandImageService.ashx" />
</Component>
<Component Id="cmp6BD39B2D572EA73C29A81AE5D1C3F0C4" Directory="INSTALLFOLDER" Guid="*">
<File Id="filE861424851E26D456D43F5D1855B3E7B" KeyPath="yes" Source="$(var.publishDir)\Dashboard.aspx" />
</Component>
...
Run Code Online (Sandbox Code Playgroud)
msbuild 的目标:
<Target Name="Build">
<!-- Compile whole solution in release mode -->
<MSBuild
Projects="..\Manager.sln"
Targets="ReBuild"
Properties="Configuration=Release" />
</Target>
<Target Name="PublishWebsite">
<!-- Remove complete publish folder in order to
be sure that everything will be newly compiled -->
<Message Text="Removing publish directory: $(SetupF)"/>
<RemoveDir Directories="$(SetupF)" ContinueOnError="false" />
<Message Text="Start to publish website" Importance="high" />
<MSBuild
Projects="..\\Manager\UI\Manager.UI.csproj"
Targets="ResolveReferences;_CopyWebApplication"
Properties="OutDir=$(Publish)bin\;WebProjectOutputDir=$(Publish);Configuration=Release" />
</Target>
<Target Name="Harvest">
<!-- Harvest all content of published result -->
<Exec
Command='"$(WiX)bin\heat.exe" website $(Publish) -dr INSTALLFOLDER -ke -srd -cg MgrWebComponents -var var.publishDir -ag -out $(WebSiteContentCode)'
ContinueOnError="false"
WorkingDirectory="." />
</Target>
<Target Name="WIX">
<!-- At last create an installer -->
<Message Text="TEST: @(WixCode)"/>
<Exec
Command='"$(WiX)bin\candle.exe" -dpublishDir=$(Publish) -dMgrWebResourceDir=. @(WixCode, ' ')'
ContinueOnError="false"
WorkingDirectory="." />
<Exec
Command='"$(WiX)bin\light.exe" -spdb -out $(MsiOut) @(WixObject, ' ')'
ContinueOnError="false"
WorkingDirectory="." />
<!-- A message at the end -->
<Message Text="Install package has been created." />
</Target>
Run Code Online (Sandbox Code Playgroud)
构建命令是: msbuild /t:Build;PublishWebsite;Harvest;WIX setup.build
我知道生成的 guid 使用目录的种子。我应该更改目录的位置吗?
谢谢!!
感谢@CheGueVerra,他为我指明了正确的方向。我刚刚将目录位置更改为 ProgramFiles 中,并且它能够编译。
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="Manager" />
</Directory>
</Directory>
</Fragment>
Run Code Online (Sandbox Code Playgroud)
后来我找到了一种更好的方法,使用“ComponentGuidGenerationSeed”属性将目录保留在 inetpub 文件夹中。
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id="IISMain" Name='inetpub'>
<Directory Id="WWWMain" Name='wwwroot'
ComponentGuidGenerationSeed='{Put-your-own-generated-guid-here}'>
<Directory Id='INSTALLFOLDER' Name='Manager'>
</Directory>
</Directory>
</Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |