WiX 설치 프로그램 버전을 현재 빌드 버전으로 설정하려면 어떻게해야합니까?


134

응용 프로그램과 WiX 설치 프로그램을 작성하고 subversion을 사용하여 버전을 제어합니다. WiX 설치 프로그램이 빌드되면 버전 번호가 응용 프로그램의 현재 빌드 버전이되기를 원합니다. 어떻게하면 되나요? C #을 사용하여 응용 프로그램을 코딩했습니다.

NB이 프로젝트를 구축하기 위해 ccnet을 사용하고 있습니다

답변:


181

당신은 사용할 수 있습니다 Product/@Version="!(bind.FileVersion.FileId)"(대체 FileIdId당신이 버전 번호를 좀하고 싶습니다있는 파일) 및 light.exe는이 참조하는 파일의 버전 값을 채 웁니다 FileId.


4
내가 찾던 것! "! (bind.FileVersion.FileId)"( "$"대신 "!")를 사용해야했지만 그렇지 않으면 전 처리기 지시문 오류가 발생했습니다.
Nicholas Piasecki

8
그래, 미안하고, 끊임없이 정신적 인 실수를 저지른다. $는 전 처리기 변수이며! 바인더 변수입니다.
Rob Mensching

20
"Fileid"는 <File Id = "Fileid"...> 요소의 값이어야하며 점 (.) 문자를 포함 할 수 있습니다.
James Hugard

6
번들 / 부트 스트 래퍼 에서도이 작업을 수행 할 수 있습니까?
noelicus

6
관련 문서에 대한 링크, 섹션 : 바인더 변수
mcdon

39

내 프로젝트 중 하나에서 실행 파일에서 파일 버전을 읽을 수있는 전 처리기 확장을 작성 하여이 작업을 수행했습니다. 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

이 확장은 Wix 3.5에서 잘 작동했으며 Wix 3.9로 업데이트 한 후에 NullPointerException이 발생합니다. 분명히이 버전 사이에 문제가 발생했습니다.
Gigo

2
@Gigo 나는 통해 작업을 얻었다 <?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?> 경우 FileId의 값입니다 Id당신의 하나의 속성 File, 안쪽 요소 Component.
Jared

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
이것은 훨씬 더 나은 대답입니다. 실제 사례에 감사드립니다.
롤백

실제 버전 번호는 어디에서 가져 옵니까?
foobar

@foobar 여기에 온지 오래되었지만, 문자열 !(bind.fileVersion.MyDLL)을 보면 <File Id="MyDLL"...섹션 을 참조하여 세 번째 부분을 사용합니다.
K0D4

이것은 나를 위해 잘 작동했습니다. 컴파일 된 실행 파일과 dll에서 작동합니다. dll은 설치 프로그램 버전과 UI 컨텐츠를 여러 위치에서 변경하지 않고도 exe 어셈블리 정보에 고정하는 데
유용

21

여기에 귀하의 부트 스트 래퍼 번들 버전을 사용하여 MyApp를 AssemblyVersion 일치하도록 얻을 수있는 매우 간단한 방법이다 BeforeBuild TargetDefineConstants .

번들 .xx :

<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.ProductNamevar.BuildVersion당신의 위 어딘가에 <Bundle>?
Brock Hensley

2
나는 이것을 시도하고 이것을 충분히 추천 할 수 없다-TeamCity의 어셈블리 패치와 결합하면 당신은 승리의 공식을 얻었습니다. 나는 번들 요소를 사용하지 않고 제품 요소를 대신 사용하여 여전히 나를 위해 일했습니다.
IbrarMumtaz

VS는 BeforeBuild타겟 을 무시하기를 좋아 하므로 AfterTargets="AfterResolveReferences"IDE에서 빌드하는 경우 명시 적으로 지정해야 할 수도 있습니다.
Dmitry

내 * .wixproj 및 Product.wxs 파일에 Bootstrapper.wixproj 코드를 추가하고 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로컬로 빌드 할 때의 기본값을 제공합니다. 그것이 무엇이든 VersionWix 에서 변수 가됩니다 . 다음과 같이 wsx 파일에서 사용하십시오.

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

설명에 버전을 포함시켜 파일 이름과 상관없이 창 탐색기 (세부 사항보기 또는 속성 페이지의 열)에서 쉽게 찾을 수 있습니다.

버전을 변수로 전달하면 파일에서 읽는 것보다 더 많은 제어가 가능합니다. 파일을 읽으면 프로그램 버전의 4 개 부분이 모두 제공됩니다. 그러나 ProductVersion 은 처음 3 개 부분 만 사용하도록 설계되었습니다.


고마워, 이것은 나의 하루를 구했다. BTW : 스니핑 된 상위 코드는 yur 프로젝트 (* .wxiproj)에 들어갑니다. Devops / VSTS CI-Build를 관리해야하는 것이 최선의 대답입니다. 최종 버전 변수가 이미 준비되었으므로. 내 경우에는 <Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>BuildVersionOfAsm이 devops 파이프 라인의 변수입니다.
Robetto

버전을 동적으로 선택하려면이 방법을 사용하여 * .wixproj에서 버전을 계속 업데이트해야합니다. 이 필드에 dll 버전으로가는 방법이 있습니까?
RDV

@RDV이 접근 방식의 목적은 .wixproj를 포함하여 소스 제어에서 파일을 변경하지 않습니다. 동적 버전 번호는 CI 시스템에서 제공합니다 (이 예에서는 AppVersion 및 BuildNumber). 일반적으로 주 버전과 부 버전 번호를 CI 변수로 설정하고 CI 시스템이 빌드 번호를 동적으로 생성하도록합니다.
Edward Brey

우수-로컬 빌드의 기본값을 포함하여 필요한 솔루션의 종류.
ColH

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.