如何自动将版本号插入AssemblyName
我正在努力建立这个问题:
从MSBuild中的文件中读取单个值
我的目标是有一个地方放置在多个项目中使用的版本号,我还想要其中一个项目的DLL文件名中的部分版本号。
基于上面的问题,我已经得到了第一部分,但我对第二部分遇到了困难,并希望得到一些指导。
在我的解决方案中,我设置了一个名为Version.txt的纯文本文件,仅包含我的完整版本号:
1.1.0.0
在我的两个项目中,我打开了AssemblyInfo.cs文件并删除了AssemblyVersion和AssemblyFileVersion项,然后修改了两个项目以在单独的文件中生成它们,如上面的问题所述。
现在,当我构建时,我为每个项目生成一个生成的Properties \ Version.cs文件,该文件用于构建EXE / DLL并在其文件属性中显示为“1.1.0.0”。 这正是我想要的。
对于DLL,我想命名程序集“filename.v1.1.dll”,其中“1.1”来自上面Version.txt中的前两个组件。 只要我能在EXE / DLL属性中获得完整的“1.1.0.0”并在DLL文件名中获得“1.1”,我就可以灵活地使用Version.txt的格式。
为了试试这个,我修改了DLL的csproj文件,使其具有:
dllfile dllfile.v$(VersionNumber)
当然,这会在文件名中插入完整版本号,这是我不想要的。
有没有人有关于如何进行的任何提示?
谢谢。
编辑:我已经能够通过将以下内容添加到我的.csproj BeforeBuild目标中来提取版本号的主要/次要组件:
$(VersionNumber.IndexOf('.')) 0 $(VersionNumberFirstDotIndex) $([MsBuild]::Add(1, $(VersionNumberFirstDotIndex))) $(VersionNumber.IndexOf('.', $(VersionNumberMinorStart))) $([MSBuild]::Subtract($([MSBuild]::Subtract($(VersionNumberSecondDotIndex), $(VersionNumberFirstDotIndex))), 1)) $(VersionNumber.Substring($(VersionNumberMajorStart), $(VersionNumberMajorLen))) $(VersionNumber.Substring($(VersionNumberMinorStart), $(VersionNumberMinorLen))) $(VersionNumberMajor).$(VersionNumberMinor)
我现在唯一缺少的是如何将此VersionNumberShort转换为DLL文件名。 除非有人有更好的想法,否则我可以采取Peter的建议并使用Move任务:
由于我需要与以前相同的属性定义,因此我将上面的代码段移动到“Common”目标中,并在此处显示的构建和清理任务中引用它。
彼得 – 如果你想把你的评论作为答案,我会接受它。
谢谢!
编辑:按照jdlugosz的回答,我尝试在我的任务中设置AssemblyName。 不幸的是,根据顶部列出的原始示例,这似乎仍然没有任何影响:
... dllfile.v$(VersionNumber)
我尝试从Visual Studio Developer命令提示符运行MSBuild:
msbuild /target:clean projfile.csproj msbuild /verbosity:diag projfile.csproj > out.txt
在此之前,我将我的csproj文件顶部和“重新定义”重命名为一个独特的东西,以便于搜索(例如“dllfileoriginal”与“dllfilemodified”)。
查看输出日志,我找不到任何对修改后文本的引用; 在输出中到处都是dllfileoriginal。
在WriteLinesToFile任务之后,看起来构建了以下目标:
- IncrementalClean(已完成)
- PostBuildEvent
- CoreBuild
- AfterBuild
- 建立
这些中没有任何DLL名称的引用。
看起来这仍然是我最好的选择。
目标名称显示在IDE属性页编辑器的“配置属性”选项卡下的“常规”页面上。 我没有一个方便自己为你查找名称,但你可以通过将IDE中的空白更改为XXXX并保存来实现。 然后在版本控制提交审阅者中查看差异,并查看该属性的名称。 在这种情况下,然后编辑行将XXXX更改为$(OutputPath)$(AssemblyName).v$(VersionNumberShort)
哦,看看FormatVersion
任务,这可能会有所帮助。 我认为有一些预制任务可以操纵类似于你所展示的版本程序集。
我正在为版本做的是通过#defines作为/D
命令行参数传递部分。 我猜你在C#中没有这个,但IIRC。
这对我有用,它解决了在构建时将版本信息字符串附加到文件名的看似简单的问题。
首先,构建后事件:
(右键单击项目 – >属性 – >构建事件 – >编辑后构建…)
$(TargetPath) "version" > $(TargetDir)text.txt set /p version= <$(TargetDir)text.txt copy $(TargetPath) $(TargetDir)$(TargetName)_%version%.exe del $(TargetDir)text.txt
现在,诀窍:重载sub main以返回版本信息,并在刚刚构建的exe上的post-build事件中调用它。
这是F#中的一个例子:
[] let main argv = let version = argv.Length = 1 && argv.[0] = "version" if version then let version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() do stdout.WriteLine(version) do stdout.Flush() else try //...
上面的构建后事件
1)使用“version”arg调用新构建的exe,并将输出写入txt文件
2)将文本文件内容读入局部变量
3)通过添加版本信息重命名新构建的exe
3)复制新建的exe,将版本信息添加到名称中
4)清理临时文件
*将“移动”更改为“复制”,以便Visual Studio仍可以F5项目