gpt4 book ai didi

git - 在 visual studio 中将 git commit hash 设置为 dll 版本号

转载 作者:太空狗 更新时间:2023-10-29 13:21:38 34 4
gpt4 key购买 nike

我正在使用 visual studio 2013 和 git 开发一个项目。

我必须分发项目的一些库,所以我想用当前的 git commit hash 设置它们的版本号,这样我就可以确定它们使用的是哪个库版本。

有没有办法以自动方式将散列作为版本号,即使用预构建事件,而不是每次都手动执行?

最佳答案

以下是使用资源文件的 native 项目可能实现的一些片段。这个想法是向项目添加一个属性表,它有一个预构建事件,它根据 git 提交哈希创建一个 .res 文件,并将这个 .res 文件添加为资源。这是属性表:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<VersionResourceOut>$(MSBuildProjectDirectory)\version.res</VersionResourceOut>
</PropertyGroup>
<ItemGroup>
<Resource Include="$(VersionResourceOut)" />
</ItemGroup>
<Import Project="$(BuildToolsDir)tools\versionrc.targets" />
<Target Name="CreateGitVersionResource" BeforeTargets="BuildGenerateSources">
<CallTarget Targets="CreateGitVersionResInBuild" />
<MakeSameWriteTime SourceFile="$(OutDir)$(TargetName)$(TargetExt)" DestFile="$(VersionResourceOut)"/>
</Target>
</Project>

$(BuildToolsDir)tools\versionrc.targets 文件是实际创建资源文件的地方。完整的实现相当冗长,因为它也适用于 svn 并允许进行大量自定义 - 此处要发布的内容有点多,所以我只列出其内容:

  • 提交哈希存储在 msbuild 属性中,获取它的命令是

    git --work-tree=$(GitVersionDir) --git-dir=$(GitVersionDir)\.git rev-parse --short HEAD

    $(GitVersionDir) 通常设置为 $(MsbuildProjectDirectory),因为我们在源根目录中有大多数 .vcxproj 文件。

  • 我也喜欢包含构建日期,因此最终进入 StringFileinfo block 的 FileDescription 条目的属性是

    <FileDesc>$(GitVersion) $([System.DateTime]::Now.ToString('HH:mm:ss dd/MM/yyyy'))</FileDesc>
  • 实际文件/产品版本、公司名称和其他字段是从其他地方获取的。通常我们有一个通用的头文件,定义了 RC 文件模板(见下文)所需的所有 VRC_XXX 宏,以及一个包含例如每个项目的头文件。 #define VRC_FILEDESC“Project Foo”,这些 header 使用 ReadLinesFromFile/WriteLinesToFile 任务 merge 。无论如何,这个想法是以一个像

    这样的头文件结束的
    #define VRC_FILEVERSION 4,4,1,0
    #define VRC_PRODUCTVERSION 4.4.1.0
    #define VRC_COMPANYNAME MyCompany
    #define VRC_PRODUCTNAME VRC_COMPANYNAME Libraries
    #define VRC_FILEDESC Project Foo
    #define VRC_FILEDESCRIPTION VRC_FILEDESC VRC_FILEDESCGIT

    谁的路径存储在 $(VersionMainInclude) 属性中。

  • 所有这些都被馈送到 rc.exe 以创建 .res 文件。完整的命令类似于

    rc /d VRC_INCLUDE=$(VersionMainInclude)
    /d VRC_ORIGINALFILENAME=$(TargetName)$(TargetExt)
    /d VRC_FILETYPE=$(FileType)
    /d VRC_FILEDESCGIT=$(FileDesc)
    /d VRC_COPYRIGHT=VRC_COMPANYNAME \251 $([System.DateTime]::Now.ToString(`yyyy`))
    /fo $(VersionResourceOut) $(MsBuildThisFileDirectory)version.rc
  • 请注意 MakeSameWriteTime 技巧,将 .res 文件的修改时间设置为与输出文件相同,以确保预构建事件不会在每次 .res 文件时触发新构建。生成res文件。可能有更好的方法来做到这一点,但这个对我有用:

    <UsingTask TaskName="MakeSameWriteTime" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
    <ParameterGroup>
    <SourceFile Required="true" ParameterType="System.String"/>
    <DestFile Required="true" ParameterType="System.String"/>
    </ParameterGroup>
    <Task>
    <Code Type="Fragment" Language="cs">
    <![CDATA[
    System.IO.File.SetLastWriteTime( DestFile, System.IO.File.GetLastWriteTime( SourceFile ) );]]>
    </Code>
    </Task>
    </UsingTask>

这是使用的完整 .rc 模板:

#include <winver.h>

#define stringize( x ) stringizei( x )
#define stringizei( x ) #x

#ifdef VRC_INCLUDE
#include stringize( VRC_INCLUDE )
#endif

#ifdef _WIN32
LANGUAGE 0x9,0x1
#pragma code_page( 1252 )
#endif

1 VERSIONINFO
FILEVERSION VRC_FILEVERSION
PRODUCTVERSION VRC_PRODUCTVERSION
FILEFLAGSMASK 0x1L
FILEFLAGS VS_FF_DEBUG
FILEOS VOS__WINDOWS32
FILETYPE VRC_FILETYPE
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", stringize( VRC_COMPANYNAME )
VALUE "FileDescription", stringize( VRC_FILEDESCRIPTION )
VALUE "FileVersion", stringize( VRC_FILEVERSION )
VALUE "LegalCopyright", stringize( VRC_COPYRIGHT )
VALUE "InternalName", stringize( VRC_ORIGINALFILENAME )
VALUE "OriginalFilename", stringize( VRC_ORIGINALFILENAME )
VALUE "ProductName", stringize( VRC_PRODUCTNAME )
VALUE "ProductVersion", stringize( VRC_PRODUCTVERSION )
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

关于git - 在 visual studio 中将 git commit hash 设置为 dll 版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738689/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com