VisualStudio 2017 项目格式 自动生成版本号 添加注释防止警告生成的文件自动添加版本

最近我把很多项目都使用了 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


本文会经常更新,请阅读原文: https://lindexi.gitee.io/lindexi/post/VisualStudio-2017-%E9%A1%B9%E7%9B%AE%E6%A0%BC%E5%BC%8F-%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E7%89%88%E6%9C%AC%E5%8F%B7.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ASP.NETCore

解决ASP.NET Core Mvc文件上传限制问题

  在ASP.NET Core MVC中,文件上传的最大上传文件默认为20MB,如果我们想上传一些比较大的文件,就不知道怎么去设置了,没有了Web.Config...

1374
来自专栏大内老A

WCF技术剖析之二:再谈IIS与ASP.NET管道

在2007年9月份,我曾经写了三篇详细介绍IIS架构和ASP.NET运行时管道的文章,深入介绍了IIS 5.x与IIS 6.0HTTP请求的监听与分发机制,以及...

19110
来自专栏.NET开发那点事

AServer - 基于Asp.net core Kestrel的超迷你http服务器

  AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里,用来快速的响应Http请求,而不...

1511
来自专栏王磊的博客

Spring.Net简单IOC应用

本文简单的介绍一下Spring.net的配置和IOC应用。 目录:   一、引用资源.   二、配置文件配置.   三、文件调用.   四、本实例代码下...

3185
来自专栏blackheart的专栏

[Asp.Net Core] 1. IIS中的 Asp.Net Core 和 dotnet watch

在基于传统的.NET Framework的Asp.Net Mvc的时候,本地开发环境中可以在IIS中建立一个站点,可以直接把站点的目录指向asp.net mvc...

3049
来自专栏技术小讲堂

ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

什么是ASP.NET Profile 可以为每个用户(包括匿名用户)储存信息 通过在Web.config中的配置即可在应用程序中使用 强类型的属性 可以定义属性...

4459
来自专栏.NET开发那点事

AServer - 基于Asp.net core Kestrel的超迷你http服务器

  AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里,用来快速的响应Http请求,而不...

1186
来自专栏跟着阿笨一起玩NET

.Net下收发邮件第三方公共库

http://www.lumisoft.ee/lswww/download/downloads/Net/

1831
来自专栏hbbliyong

WCF 学习总结1 -- 简单实例

从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术。WCF统一的模型整合了以往的 WebS...

3887
来自专栏緣來來來

Mac 下使用tree命令列目录

相信很多使用过Linux的用户都用过tree命令,它可以像windows的文件管理器一样清楚明了的显示目录结构。不过有是有并不是系统本身就自带的,如果需要的话,...

1621

扫码关注云+社区

领取腾讯云代金券