2018-8-10-VisualStudio-2017-项目格式-自动生成版本号

title author date CreateTime categories
VisualStudio 2017 项目格式 自动生成版本号
lindexi
2018-08-10 19:16:52 +0800
2018-06-10 11:33:35 +0800
VisualStudio

最近我把很多项目都使用了 VisualStudio 2017 新项目格式,在使用的时候发现一些比较好用的功能。
本文告诉大家如何使用 VisualStudio 2017 项目格式自动生成版本号

在看本文之前,我认为大家都不是第一次接触 VisualStudio 2017 项目格式。新的项目格式是比较简单的,但是也有一些设置项是比较复杂。

创建一个 UWP 使用 VisualStudio 2017 项目格式请看将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件 - walterlv

请看最简单创建一个 UWP 项目的代码

<Project Sdk="MSBuild.Sdk.Extras/1.5.4">
<PropertyGroup>
<TargetFrameworks>uap10.0.16299;</TargetFrameworks>
</PropertyGroup> <ItemGroup>
<PackageReference Include="MSBuild.Sdk.Extras" Version="1.5.4" />
</ItemGroup>
</Project>

这里是使用多个平台,使用最低版本 16299 的原因是需要支持 dotnet standard

如果创建的项目是用来发布 nuget 的,那么就需要做一些设置,在继续阅读文本,我希望大家先看项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦) - walterlv

添加注释

如果需要在发布的 dll 添加 文档注释,那么请加下面代码

   <PropertyGroup>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
</PropertyGroup>

所有的下面的代码都是放在 Project 标签里

<Project Sdk="MSBuild.Sdk.Extras/1.5.4">
<PropertyGroup>
<TargetFrameworks>uap10.0.16299;</TargetFrameworks>
</PropertyGroup> <PropertyGroup>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
</PropertyGroup> <ItemGroup>
<PackageReference Include="MSBuild.Sdk.Extras" Version="1.5.4" />
</ItemGroup>
</Project>

因为 bin\$(Configuration)\$(TargetFramework) 可以使用 $(OutputPath) 替换,上面的代码可以修改为

   <PropertyGroup>
<DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile>
</PropertyGroup>

防止警告生成的文件

一些生成的文件会让 VisualStudio 编译时警告,使用下面代码可以让 VisualStudio 不分析生成的文件

<Target Name="PragmaWarningDisablePrefixer" AfterTargets="MarkupCompilePass2">
<ItemGroup>
<GeneratedCSFiles Include="**\*.g.cs;**\*.g.i.cs" />
</ItemGroup>
<Message Text="CSFiles: @(GeneratedCSFiles->'&quot;%(Identity)&quot;')" />
<Exec Command="for %%f in (@(GeneratedCSFiles->'&quot;%(Identity)&quot;')) do echo #pragma warning disable &gt; %%f.temp &amp;&amp; type %%f &gt;&gt; %%f.temp &amp;&amp; move /y %%f.temp %%f" />
</Target>

自动添加版本

  <PropertyGroup>
<Build>$([System.DateTime]::op_Subtraction($([System.DateTime]::get_Now().get_Date()),$([System.DateTime]::new(2000,1,1))).get_TotalDays())</Build>
<Revision>$([MSBuild]::Divide($([System.DateTime]::get_Now().get_TimeOfDay().get_TotalSeconds()), 2).ToString('F0'))</Revision>
<Version>2.1.0.$(Revision)</Version>
</PropertyGroup>

这样就可以自动添加版本号,虽然生成的版本号是用时间生成

这样的用法请看项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv

如果只是想添加打包的版本号,请使用下面的代码

 <PropertyGroup>
<Build>$([System.DateTime]::op_Subtraction($([System.DateTime]::get_Now().get_Date()),$([System.DateTime]::new(2000,1,1))).get_TotalDays())</Build>
<Revision>$([MSBuild]::Divide($([System.DateTime]::get_Now().get_TimeOfDay().get_TotalSeconds()), 2).ToString('F0'))</Revision>
<Version>2.1.0</Version>
<PackageVersion>2.1.5.$(Revision)</PackageVersion>
</PropertyGroup>

打包的版本号是 PackageVersion ,项目版本号是 Version ,在打包的时候,找不到 PackageVersion 会自动使用 Version ,所以如果需要项目版本号和打包版本号不相同,就定义 Version 和 PackageVersion 使用不同的值。

但是很多小伙伴都是设置打包的版本号和项目版本号相同,这样如果有人说某个nuget出现问题,可以很快找到是哪里的问题。或者发布出去的包,可以通过查看 dll 的版本号就知道是哪个 Nuget 发布,因为 dll 的版本号和 nuget 的相同。

参见:Roland Weigelt - How to Disable Warnings in Generated C# Files of UWP Apps

2018-8-10-VisualStudio-2017-项目格式-自动生成版本号

上一篇:使用私有gitlab发布自动生成版本号和标签(version和tag)(骚)


下一篇:MyEclipse 启动慢,优化