WiXインストーラーのバージョンを現在のビルドバージョンに設定するにはどうすればよいですか?


134

アプリケーションとそのWiXインストーラーを作成し、subversionを使用してバージョン管理下に置きました。WiXインストーラーがビルドするときに、そのバージョン番号をアプリケーションの現在のビルドバージョンにしたいと考えています。どうすればこれを達成できますか?アプリケーションのコーディングにはc#を使用しました。

注:このプロジェクトをビルドするためにccnetを使用しています

回答:


181

あなたは使用することができますProduct/@Version="!(bind.FileVersion.FileId)"(交換するFileIdIdバージョン番号を取得したいのですが、そこからファイルの)とlight.exeが参照するファイルのバージョンに値を移入しますFileId


4
まさに私が探していたもの!「!(bind.FileVersion.FileId)」(「$」の代わりに「!」)を使用する必要がありましたが、それ以外の場合は、プリプロセッサディレクティブエラーが発生しました。
ニコラスピアセッキ

8
ええ、申し訳ありませんが、私は常に精神的な間違いを犯しています。$はプリプロセッサ変数であり、!バインダー変数です。
Rob Mensching 2009年

20
「Fileid」は<File Id = "Fileid" ...>要素の値である必要があり、明らかにドット(。)文字を含めることができることに注意してください。
James Hugard、2013

6
バンドル/ブートストラップでもこれを行うことは可能ですか?
noelicus 2013

6
関連ドキュメントへのリンク、セクション:Binder Variables
mcdon

39

私は自分のプロジェクトの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/


拡張機能はまだ機能しますか?参照として追加しようとすると、エラーが発生しました。
Stefan Vasiljevic 2014年

この拡張機能はWix 3.5で問題なく機能しました。Wix3.9にアップデートすると、NullPointerExceptionがスローされます。明らかに、これらのバージョン間で何かが壊れました。
Gigo、2015

2
@Gigo私は経由で作業それを得た<?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> ところFileIdの値であるIdあなたの1の属性File内の要素Component
2016年

CodePlexリンクが開かない。独自のプリプロセッサ拡張機能を作成する以外に方法はありますか?
RDV

28

誰かが実際の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>

1
これははるかに良い答えです。実施例をありがとう。
2017

実際のバージョン番号をどこで取得していますか?
foob​​ar 2017年

@foobar私がここにいるのは久しぶりですが、文字列を見る!(bind.fileVersion.MyDLL)と、<File Id="MyDLL"...セクションを参照するために3番目の部分を使用しています
K0D4

これは私にとってはうまくいきました。複数の場所で変更を加えることなく、インストーラーのバージョンとUIコンテンツをexeアセンブリ情報に固定するのに最適なdllだけでなく、コンパイルされた実行可能ファイルでも機能します
rcbevans

21

ここにあなたのブートストラップバンドルバージョンが使用しての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>

@AliKazmiあなたvar.ProductNameとあなたのvar.BuildVersionどこかにあなたを定義しましたか<Bundle>
Brock Hensley 14年

2
私はこれを試しましたが、これを十分にお勧めすることはできません。TeamCityのアセンブリパッチャーと組み合わせると、優れた式が得られます。Bundle要素ではなくproduct要素を使用しましたが、それでも機能しました。
IbrarMumtaz 2015年

VSは単にBeforeBuildターゲットを無視するのが好きなのでAfterTargets="AfterResolveReferences"、IDEでビルドする場合は明示的に指定する必要があるかもしれません
Dmitry

私は私の* .wixprojにBootstrapper.wixprojコードを追加してProduct.wxsファイルで、私はとbuildversion変数を定義した:
RDV

4

アプリケーションのビルドスクリプトの場合と同じように、セットアッププロジェクトの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つの部分のみを使用するように設計されています。


おかげで、これは私の一日を救った。ところで、上のコードは、yurプロジェクト(* .wxiproj)に入れられます。Devops / VSTS CI-Buildを管理する必要があることが、これが最良の答えです。私はすでに最終バージョンの変数の準備ができているので。私の場合は次のようになりました:<Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>BuildVersionOfAsmはdevopsパイプラインの変数です。
ロベット

バージョンを動的に選択したいのですが、この方法では、*。wixprojのバージョンを更新し続ける必要があります。このフィールドでdllのバージョンにアクセスする方法はありますか?
RDV

@RDVこのアプローチの目的は、.wixprojを含むソース管理のファイルを変更することではありません。動的バージョン番号はCIシステムによって提供されます(この例ではAppVersionとBuildNumber)。通常、メジャーバージョン番号とマイナーバージョン番号をCI変数として設定し、CIシステムにビルド番号を動的に生成させます。
Edward Brey

すばらしい-ローカルビルドのデフォルトを含め、私が必要としていた種類のソリューション。
ColH

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.