回答:
あなたは使用することができますProduct/@Version="!(bind.FileVersion.FileId)"(交換するFileIdとIdバージョン番号を取得したいのですが、そこからファイルの)とlight.exeが参照するファイルのバージョンに値を移入しますFileId。
私は自分のプロジェクトの1つで、実行可能ファイルからファイルバージョンを読み取るプリプロセッサ拡張を作成することでこれを行いました。したがって、WiXファイルは次のようになります。
<?define ProductName="$(fileVersion.ProductName($(var.MyApp.TargetPath)))" ?>
<?define CompanyName="$(fileVersion.CompanyName($(var.MyApp.TargetPath)))" ?>
<?define ProductVersion="$(fileVersion.ProductVersion($(var.MyApp.TargetPath)))" ?>
<Product
Id="<product ID>"
Name="$(var.ProductName)"
Version="$(var.ProductVersion)"
Manufacturer="$(var.CompanyName)"
Language="1033"
UpgradeCode="<upgrade code>">
CodePlexにコードを投稿しました:http : //wixfileversionext.codeplex.com/
<?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> ところFileIdの値であるIdあなたの1の属性File内の要素Component。
誰かが実際のXMLの例を探している場合、これは.NETアセンブリで機能します(AssemblyまたはKeyPath属性を実行する必要はありません)。[...]プレースホルダーを使用して、無関係なコードを削除しました:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product [...] Version="!(bind.fileVersion.MyDLL)">
[...]
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="INSTALLDIR" Name="MyDLLInstallLocation">
<Component Id="MainLib" Guid="[...]">
<File Id="MyDLL" Name="MyDll.dll" Source="MyDll.dll" />
[...]
</Component>
[...]
</Directory>
</Directory>
</Directory>
</Product>
</Wix>
!(bind.fileVersion.MyDLL)と、<File Id="MyDLL"...セクションを参照するために3番目の部分を使用しています
ここにあなたのブートストラップバンドルバージョンが使用してのMyAppのAssemblyVersionを一致させるために取得するための非常に単純な方法だBeforeBuild TargetとはDefineConstants。
Bundle.wxs:
<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
Version="$(var.BuildVersion)"
Bootstrapper.wixproj:
<Target Name="BeforeBuild">
<GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
<Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
</GetAssemblyIdentity>
<PropertyGroup>
<DefineConstants>BuildVersion=%(AssemblyVersion.Version)</DefineConstants>
</PropertyGroup>
</Target>
var.ProductNameとあなたのvar.BuildVersionどこかにあなたを定義しましたか<Bundle>?
BeforeBuildターゲットを無視するのが好きなのでAfterTargets="AfterResolveReferences"、IDEでビルドする場合は明示的に指定する必要があるかもしれません
アプリケーションのビルドスクリプトの場合と同じように、セットアッププロジェクトのMSBuildスクリプトにバージョンを渡すことができます。
たとえば、CIシステムが変数AppVersionとを定義しBuildNumber、それらをMSBuildスクリプトに渡す場合、wixprojは対応するVersionプロパティを作成して、次のようにWixに転送できます。
<PropertyGroup>
<Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
<Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
<DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>
の最初の定義Versionは、ローカルでビルドする場合のデフォルトを提供します。最終的に何VersionがWixの変数になります。次のようなwsxファイルで使用します。
<Product Version="$(var.Version)" ...>
<Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />
説明にバージョンを含めて、ファイル名に関係なくウィンドウエクスプローラーから(詳細ビューの列または[プロパティ]ページで)簡単に検索できるようにします。
バージョンを変数として渡すと、ファイルから読み取るよりも制御しやすくなります。ファイルから読み取ると、プログラムバージョンの4つの部分すべてが取得されます。ただし、ProductVersionは最初の3つの部分のみを使用するように設計されています。
<Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>BuildVersionOfAsmはdevopsパイプラインの変数です。
これは、達成しようとしていることにかなり近いように見えます。クルーズコントロールに相当するものをご覧ください。
http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/