WiX yükleyici sürümünü geçerli derleme sürümüne nasıl ayarlayabilirim?


134

Bir uygulama ve WiX yükleyicisi yazdım ve subversion kullanarak sürüm kontrolü altına aldım. WiX yükleyicisi oluşturulduğunda, sürüm numarasının uygulamanın geçerli derleme sürümü olmasını istiyorum. Bunu nasıl başarabilirim? Uygulamayı kodlamak için c # kullandım.

Not Bu projeyi oluşturmak için ccnet kullanıyorum

Yanıtlar:


181

Sen kullanabilirsiniz Product/@Version="!(bind.FileVersion.FileId)"(replace FileIdile Idsürüm numarasını almak istediğiniz dosyanın) ve light.exe tarafından başvurulan dosya sürümüyle değerini dolduracaktır FileId.


4
Tam da aradığım şey! "! (Bind.FileVersion.FileId)" ("$" yerine "!") Kullanmak zorunda kalmama rağmen, aksi takdirde bir önişlemci yönergesi hatası aldım.
Nicholas Piasecki

8
Evet, özür dilerim, sürekli zihinsel bir hata yapıyorum. $ önişlemci değişkeni ve! bağlayıcı değişkendir.
Rob Mensching

20
"Fileid" öğesinin bir <File Id = "Fileid" ...> öğesinden değer olması gerektiği ve nokta (.) Karakterini içerebileceğini unutmayın.
James Hugard

6
Bunu bir paket / bootstrapper için de yapmak mümkün mü?
noelicus

6
İlgili belgelere bağlantı, bölüm: Bağlayıcı Değişkenleri
mcdon

39

Bunu projelerimden birinde, yürütülebilir dosyayı dosya sürümünü okumak için bir önişlemci uzantısı yazarak yaptım. WiX dosyası şöyle görünür:

<?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 için kodu gönderdim: http://wixfileversionext.codeplex.com/


Uzantınız hala çalışıyor mu? Referans olarak eklemeyi denedim ve bir hata aldım.
Stefan Vasiljevic

Bu uzantı Wix 3.5 ile harika çalıştı, Wix 3.9'a güncelledikten sonra bir NullPointerException oluşturur. Açıkçası bu versiyonlar arasında bir şey kırıldı.
Gigo

2
@Gigo ben üzerinden çalışma var <?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> nerede FileIddeğeridir Idsizin birinin özniteliği Filebir iç elemanları Component.
Jared

CodePlex bağlantısı benim için açılmıyor. Kendi ön işlemci uzantınızı yazmak dışında başka bir yol var mı?
RDV

28

Birisi gerçek bir XML örneği arıyorsa, bu .NET derlemeleri ile çalışır (ve Assembly veya KeyPath özniteliklerini yapmanız gerekmez). [...] yer tutucularla ilgisiz kodu eledim:

<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
Bu çok daha iyi bir cevap. Çalışma örneği için teşekkür ederim.
rulo

gerçek sürüm numarasını nereden alıyor?
foobar

@foobar Onun Burada olduğumu beri dize bakarsanız, ancak ederken olmuştur !(bind.fileVersion.MyDLL)o referans 3. bir kısım kullanan <File Id="MyDLL"...bölüm
K0D4

Bu benim için iyi çalıştı. Birden fazla yerde bir şeyleri değiştirmek zorunda kalmadan, yükleyici sürümünü ve kullanıcı arabirimi içeriğini exe montaj bilgisine sabitlemek için harika olan derlenmiş yürütülebilir dosyalar ve
dll'ler için çalışır

21

Bootstrapper Bundle Sürümünüzü bir BeforeBuild Targetve kullanarak MyApp AssemblyVersion'unuza uyacak şekilde almanın çok basit bir yoluDefineConstants .

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 Kendinizi var.ProductNameve üzerinde var.BuildVersionherhangi bir yeri tanımladınız mı <Bundle>?
Brock Hensley

2
Bunu denedim ve yeterince tavsiye edemiyorum - TeamCity için montaj yamasıyla birleştirin ve kazanan bir formülünüz var. Paket öğesini değil, onun yerine bir ürün öğesini kullandım ve hala benim için çalıştım.
IbrarMumtaz

VS sadece BeforeBuildhedefi görmezden gelmeyi seviyor, bu yüzden AfterTargets="AfterResolveReferences"IDE'de inşa ediyorsanız açıkça belirtmek gerekebilir
Dmitry

Bootstrapper.wixproj kodunu * .wixproj dosyasına ve Product.wxs dosyasına ekledim, buildversion değişkenini şu şekilde tanımladım:
RDV

4

Sürümü, kurulum projeniz için MSBuild komut dosyasına uygulamanın yapı komut dosyası için geçebildiğiniz gibi geçirebilirsiniz.

Örneğin, CI sisteminiz değişkenleri tanımlar AppVersionve BuildNumberbunları MSBuild komut dosyalarınıza iletirse, wixproj'unuz Wix'e şu şekilde ilettiği karşılık gelen bir Versionözellik oluşturabilir:

<PropertyGroup>
    <Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
    <Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
    <DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>

İlk tanımı Versionyerel olarak inşa ettiğiniz zaman için bir varsayılan sağlar. Ne olursa olsun VersionWix'te bir değişken olur . Aşağıdaki gibi bir wsx dosyasında kullanın:

<Product Version="$(var.Version)" ...>
    <Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />

Sürümü, dosya adından bağımsız olarak Windows Gezgini'nden (Ayrıntı görünümünde veya Özellikler sayfasında bir sütun olarak) aramak kolay olacak şekilde açıklamaya dahil etmek istiyorum.

Sürümü bir değişken olarak iletmek, dosyayı bir dosyadan okumaktan daha fazla kontrol sağlar. Bir dosyadan okuduğunuzda, programlı sürümün 4 bölümünün hepsini alırsınız. Ancak, ProductVersion yalnızca ilk 3 parçayı kullanmak üzere tasarlanmıştır.


Teşekkürler, bu benim günümü kurtardı. BTW: Kesilen üst kod projeye giriyor (* .wxiproj). Bir Devops / VSTS CI-Build'ı yönetmek en iyi yanıt budur. Zaten son sürüm değişkenim hazır olduğundan. Benim durumumda döndü: <Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>BuildVersionOfAsm devops boru hatlarında bir değişkendir.
Robetto

Sürümü dinamik olarak seçmek istiyorum, bu yöntem sürümü * .wixproj'da güncellemeye devam etmemi gerektiriyor. Bu alanda herhangi bir dll sürümü için bir yolu var mı?
RDV

@RDV Bu yaklaşımla amaç, .wixproj da dahil olmak üzere kaynak denetimindeki hiçbir dosyayı değiştirmektir. Dinamik sürüm numarası CI sisteminiz tarafından sağlanır (bu örnekte AppVersion ve BuildNumber). Genellikle, büyük ve küçük sürüm numaralarını CI değişkenleri olarak ayarlarsınız ve CI sisteminin derleme numarasını dinamik olarak oluşturmasını sağlarsınız.
Edward Brey

Mükemmel - yerel yapılar için bir varsayılan da dahil olmak üzere ihtiyacım olan türden bir çözüm.
ColH

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.