Skip to content

Instantly share code, notes, and snippets.

@Tocchann
Last active April 19, 2025 07:41
Show Gist options
  • Save Tocchann/327bd36c5fff7b3cb40242f1a0ac75b4 to your computer and use it in GitHub Desktop.
Save Tocchann/327bd36c5fff7b3cb40242f1a0ac75b4 to your computer and use it in GitHub Desktop.
csproj, vcxproj で実際にバージョンを自動更新するための定義(SetupFileVersion.ps1とセットで使うw)
<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- FileVersion と、StartYear はあらかじめターゲットのプロジェクトで設定しておくこと -->
<Target Name="ValidateNeedGenerateVersionProperties">
<Error Condition="'$(StartYear)' == ''" Text="プロパティ 'StartYear' が定義されていません。" />
<Error Condition="'$(Version)' == '' and '$(FileVersion)' == ''" Text="プロパティ 'Version' か 'FileVersion' の定義が必要です。" />
</Target>
<!--ビルド済みのバージョン情報を取得して、新しいバージョンを定義する PowerShell スクリプト。アウトプットを Item として取り込む-->
<Target Name="GenerateVersionDetail">
<PropertyGroup>
<PreDefinedFileVersion>$(FileVersion)</PreDefinedFileVersion>
<PreDefinedFileVersion Condition="'$(PreDefinedFileVersion)' == ''">$(Version)</PreDefinedFileVersion>
</PropertyGroup>
<Message Text="StartYear: $(StartYear)" Importance="low" />
<Message Text="Version: $(Version)" Importance="low" />
<Message Text="FileVersion: $(FileVersion)" Importance="low" />
<Message Text="PreDefinedFileVersion: $(PreDefinedFileVersion)" Importance="low" />
<!--PowerShellスクリプトとして動かして、パスを取り込む(pwshにしてるけど、PowerShell のほうがほかの環境でも確実に動かせるか?)-->
<Exec Command="PowerShell –NonInteractive -ExecutionPolicy Unrestricted -Command $(MSBuildThisFileDirectory)SetupFileVersion.ps1 $(TargetPath) $(StartYear) $(PreDefinedFileVersion)" IgnoreExitCode="true" ConsoleToMsBuild="true">
<Output ItemName="_FileVersions" TaskParameter="ConsoleOutput" />
</Exec>
</Target>
<PropertyGroup>
<GenerateVersionDetailDependsOn>
ValidateNeedGenerateVersionProperties;
GenerateVersionDetail;
</GenerateVersionDetailDependsOn>
</PropertyGroup>
<!--SDK形式でのファイルバージョン定義を用意する-->
<Target Name="GenerateSdkReferFileVersion" BeforeTargets="PreBuildEvent" DependsOnTargets="$(GenerateVersionDetailDependsOn)" Condition="'$(NeedSdkFileVersion)' =='true'">
<PropertyGroup>
<Version Condition="'$(Version)' == ''">$(PreDefinedFileVersion)</Version>
<FileVersion>@(_FileVersions, '.')</FileVersion>
</PropertyGroup>
<Message Text="FileVersion: $(FileVersion)" Importance="low" />
</Target>
<!--VC++プロジェクト用のファイルバージョン定義を用意する。-->
<Target Name="GenerateCppReferFileVersion" BeforeTargets="PreBuildEvent" DependsOnTargets="$(GenerateVersionDetailDependsOn)" Condition="'$(NeedCppFileVersion)' =='true'">
<PropertyGroup>
<CppFileVersionStr>@(_FileVersions, '.')</CppFileVersionStr>
<CppFileVersion>@(_FileVersions, ',')</CppFileVersion>
</PropertyGroup>
<Message Text="CppFileVersionStr: $(CppFileVersionStr)" Importance="low" />
<Message Text="CppFileVersion: $(CppFileVersion)" Importance="low" />
<CreateItem Include="#define VER_FILEVERSION $(CppFileVersion)">
<Output ItemName="CppVersionInfoLines" TaskParameter="Include" />
</CreateItem>
<CreateItem Include="#define VER_FILEVERSION_STR %22$(CppFileVersionStr)%22">
<Output ItemName="CppVersionInfoLines" TaskParameter="Include" />
</CreateItem>
<CombinePath BasePath="$(IntermediateOutputPath)" Paths="$(MSBuildProjectName).VersionInfo.h">
<Output TaskParameter="CombinedPaths" PropertyName="CppVersionInfoFilePath" />
</CombinePath>
<ReadLinesFromFile File="$(CppVersionInfoFilePath)" Condition="Exists('$(CppVersionInfoFilePath)')">
<Output ItemName="Prior_CppVersionInfoLines" TaskParameter="Lines" />
</ReadLinesFromFile>
<!--そのままルートに吐き出す-->
<WriteLinesToFile File="$(CppVersionInfoFilePath)" Lines="@(CppVersionInfoLines)" Overwrite="true" Condition="'@(CppVersionInfoLines)' != '@(Prior_CppVersionInfoLines)'" />
</Target>
<!--AssemblyInfo.csのバージョン定義だけを自動生成する-->
<Target Name="GenerateVersionInfoCS" BeforeTargets="PreBuildEvent" DependsOnTargets="$(GenerateVersionDetailDependsOn)" Condition="'$(NeedNetfxFileVersion)' == 'true'">
<PropertyGroup>
<FileVersion>@(_FileVersions, '.')</FileVersion>
</PropertyGroup>
<CreateItem Include='[assembly: System.Reflection.AssemblyVersion( "$(PreDefinedFileVersion)" )]'>
<Output ItemName="CsVersionInfoLines" TaskParameter="Include" />
</CreateItem>
<CreateItem Include='[assembly: System.Reflection.AssemblyFileVersion( "$(FileVersion)" )]'>
<Output ItemName="CsVersionInfoLines" TaskParameter="Include" />
</CreateItem>
<Message Text="CsVersionInfoLines: @(CsVersionInfoLines)" Importance="low" />
<CombinePath BasePath="$(IntermediateOutputPath)" Paths="$(MSBuildProjectName).VersionInfo.cs">
<Output TaskParameter="CombinedPaths" PropertyName="CsVersionInfoFilePath" />
</CombinePath>
<ReadLinesFromFile File="$(CsVersionInfoFilePath)" Condition="Exists('$(CsVersionInfoFilePath)')">
<Output ItemName="Prior_CsVersionInfoLines" TaskParameter="Lines" />
</ReadLinesFromFile>
<!--変更が出る場合のみ更新する(呼ばれたらつくっちゃうけどね…)-->
<WriteLinesToFile File="$(CsVersionInfoFilePath)" Lines="@(CsVersionInfoLines)" Overwrite="true" Condition="'@(CsVersionInfoLines)' != '@(Prior_CsVersionInfoLines)'"/>
<ItemGroup>
<Compile Condition="Exists('$(CsVersionInfoFilePath)')" Include="$(CsVersionInfoFilePath)" />
</ItemGroup>
</Target>
</Project>
@Tocchann
Copy link
Author

C++向けの出力を $(IntermediateOutputPath) に $(MSBuildProjectName).VersionInfo.h というファイル名で出力する形に変更したため、リソースの追加ディレクトリに $(IntermediateOutputPath) または $(IntDir) を追加する必要があるので注意が必要。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment