답변:
당신은 사용할 수 있습니다 Product/@Version="!(bind.FileVersion.FileId)"
(대체 FileId
에 Id
당신이 버전 번호를 좀하고 싶습니다있는 파일) 및 light.exe는이 참조하는 파일의 버전 값을 채 웁니다 FileId
.
내 프로젝트 중 하나에서 실행 파일에서 파일 버전을 읽을 수있는 전 처리기 확장을 작성 하여이 작업을 수행했습니다. 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
당신의 하나의 속성 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"...
섹션 을 참조하여 세 번째 부분을 사용합니다.
여기에 귀하의 부트 스트 래퍼 번들 버전을 사용하여 MyApp를 AssemblyVersion 일치하도록 얻을 수있는 매우 간단한 방법이다 BeforeBuild Target
및DefineConstants
.
번들 .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>
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/