【问题标题】:How to programatically update AssemblyInfo.cs as a Pre-Build event (Visual Studio / msbuild)如何以编程方式将 AssemblyInfo.cs 更新为 Pre-Build 事件 (Visual Studio / msbuild)
【发布时间】:2019-08-27 01:53:15
【问题描述】:

我希望在我的项目中定义一个位置来存储版本字符串。我正在寻找的行为是将版本存储在项目目录中的文本文件 (version.txt) 中,然后我的预构建事件更新 Properties/AssemblyInfo.cs 中的内容。

[assembly: AssemblyVersion("<Version>")]
[assembly: AssemblyFileVersion("<Version>")]

是的,我知道只有两个字段并且它们彼此相邻,但我仍然想知道这是否可能。

我编写并测试了执行此功能的 Powershell 脚本。

$assemblyInfoPath = "Properties\AssemblyInfo.cs"
$versionText = (Get-Content -Path version.txt -ReadCount 0)
$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0)
$assemblyInfoText = $assemblyInfoText -replace '\[assembly: AssemblyVersion\("((\d)+|(\.))*"\)\]', "[assembly: AssemblyVersion(`"$versionText`")]"
$assemblyInfoText -replace '\[assembly: AssemblyFileVersion\("((\d)+|(\.))*"\)\]', "[assembly: AssemblyFileVersion(`"$versionText`")]" | Set-Content -Path $assemblyInfoPath

失败(我认为)是预构建步骤中的调用:

预构建事件命令行:

powershell $(ProjectDir)set_assembly_version.ps1

我没有尝试使用 msbuild 运行它,只通过 Visual Studio 2017 运行。这是否可能,因为 AssemblyInfo.cs 是一个项目文件?

【问题讨论】:

  • 在构建过程中更改源代码并不是最好的主意……但是您尝试做的应该可以。将构建日志级别(选项->构建和运行)设置为详细(或诊断)并仔细阅读日志...

标签: c# visual-studio msbuild .net-assembly assemblyinfo


【解决方案1】:

我试图做同样的事情,但发现我的系统没有配置为允许我通过这样的命令执行 powershell 脚本。我本可以解决这个问题,但不是要求每个人对他们的机器进行相同的编辑,我想我会构建一个不需要执行外部脚本文件的完整预构建命令。主要的“挑战”是确保我正确地逃脱了一切。

由于我的项目性质,我的版本有很多变化。我试图准确地重新创建您在命令中尝试执行的操作,您应该能够将其插入到您的预构建事件中:

powershell $assemblyInfoPath = \"$(projectDir)Properties\AssemblyInfo.cs\";$versionText = (Get-Content -Path \"$(projectDir)version.txt\" -ReadCount 0);$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0);$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyVersion\(".*"\)\]$\", \"[assembly: AssemblyVersion(`\"$versionText`\")]\";$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyFileVersion\(".*"\)\]$\", \"[assembly: AssemblyFileVersion(`\"$versionText`\")]\";Set-Content -Path $assemblyInfoPath -Value $assemblyInfoText;

【讨论】:

    【解决方案2】:

    失败(我认为)是预构建步骤中的调用:

    任何错误信息?当我们在pre-build event 中设置命令时,它实际上调用了cmd.exe 来执行命令。所以你应该确保这个脚本在 cmd.exe 中成功执行,然后你可以在 pre-build 事件中使用它。

    我注意到你在 ps 脚本中使用了相对路径 Properties\AssemblyInfo.cs,这可以被 msbuild 识别,因为在构建这个项目时,msbuild 知道当前的 ProjectDir,所以它知道在哪里可以找到 Properties\AssemblyInfo.cs。但是如果不知道当前项目目录,cmd.exe执行这个脚本可能会报错。请检查这一点。

    我没有尝试使用 msbuild 运行它,仅通过 Visual Studio 2017. 由于 AssemblyInfo.cs 是一个项目文件,这是否可能?

    注意:MSbuild 是 VS 的构建引擎。因此,即使您在 VS 中构建 C# 项目,您实际上也是在调用 msbuild.exe 来构建它们。(对于 VS2017)

    Msbuild 将在 CoreCompile Target 或(其他编译目标?)中编译源文件(包括 Assembly.cs 文件)。将构建输出日志详细程度更改为正常,然后您可以看到构建顺序。看到这个:

    PreBuildEvent 将在 Compile 目标之前执行,所以它是可能的。但是,在构建过程中,有时VS会占用源文件,所以我不确定你的方法是否最终能成功。如果有任何错误信息,请随时分享:)

    还有什么原因你需要在预编译事件中设置版本,也许你可以使用this approach自动增加版本。对于 VS2017,将 xx.csproj 中的Deterministic 属性从 true 更改为 false,它可以在构建过程中自动增加程序集版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2016-04-06
      相关资源
      最近更新 更多