近期想对自己的项目增加自动编译并生成nuget包,网上资料不少。但总还有迷糊的时候。首先:此解决方案包含多种版本的项目,如:有编译必须是x86平台,以及还有传统的.net foramework项目,以及多版本的.net core项目等。找到通用的解决方案还是用了不少的时间。本文章就对此做下自我总结。望对同仁有所帮助。

一、遇到的问题,以及解决办法

1.1 不同平台的编译怎么办

.net可以将dll(或者说是项目)编译成x86、x64、anycpu 等至少三种平台代码。但如果用dotnet build生成项目时,默认是anycpu,需要通过platform参数来执行平台。可是,如果你一个解决方法中即有x86项目、又有anycpu项目可怎么是好呢。解决办法:创建两个sln文件,一个用x86平台的编译,一个用于anycpu平台的编译。

1.2 传统.net framework项目,怎么用dotnet 进行编译

这个问题其实最终的解决办法也很简易,就是将.net framework项目直接迁移成dotnet 可编译的项目。步骤以一个.net 4.6.1项目为例:

  • 传统的.net framework项目

  • 卸载此项目,并编辑.csproj文件

当前步骤编辑好的.csproj文件如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<TargetFramework>net461</TargetFramework>
</PropertyGroup> </Project>
  • 移除Properites中的assemblyInfo文件

因为dotnet 会自动创建assemblyInfo相关的信息文件,如果要自定义,可以找到相关资料进行限制

注意,少了assemblyinfo.cs文件。

  • 还原相关引用

生成项目,根据提示引用相关类型,默认调整后的是 类库 文件,如果需要变成 应用执行程序,可以自己修正即可。

  • 生成并运行

在还原好依赖项,以及调整好输出类型后,即可完成 项目的迁移。最终的项目结果:

以及最终生成的csproj文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<TargetFramework>net461</TargetFramework>
<ApplicationIcon />
<OutputType>Exe</OutputType>
<StartupObject />
</PropertyGroup> <ItemGroup>
<ProjectReference Include="..\..\src\SAM.Configuration\SAM.Configuration.csproj" />
<ProjectReference Include="..\..\src\SAM.Framework\SAM.Framework.csproj" />
</ItemGroup> </Project>
  • 多版本的支持

如果你需要的项目即能在.net40,.net461, .net core2.0上运行,那就需要做到多版本兼容。方式即为简单,需要将TargetFramework改为TargetFrameworks,然后多版本用分号隔开即可:

<TargetFrameworks>net461;net40;netcoreapp2.0</TargetFrameworks>

二、统一实现

在解决了上述三个主要问题之后,实现自动编译和出包就很简单。我们可以写一个ps1文件来实现,也就是powershell脚本,整体代码如下:

#定义全局变量

$destFolder = Get-Location;
$version = "1.0.0.0-alpha"; #编译anycpu的包
$anycpuPath = $destFolder.Path + "\..\SAM.Framework.anycpu.sln";
dotnet pack $anycpuPath --output $destFolder.Path /p:PackageVersion=$version; #编译x86的包
$anycpuPath = $destFolder.Path + "\..\SAM.Framework.x86.sln";
dotnet pack $anycpuPath --output $destFolder.Path /p:PackageVersion=$version /p:platform=x86; pause

是不是很简单,几句代码就是实现将所有项目生成nuget包。且还可以分平台实现。核心参数说明:

  • /p:是设置msbuild相关参数的入口,如:包版本(版本在dotnet core上好像此支持三个阶段,如:1.0.0这种,而四阶段没有了),以及平台等。
  • --output:生成的包输出文件夹

此命令还有些不足点,如 anycpu和x86中都编译同一个项目,后者的编译会覆盖前者(感觉可以用nuget包依赖来解决)。

三、后话

在解决此问题之前,本人也走了不少的弯路。如寻找msbuild与dotnet build的兼容方案,以及如何动态修正sln文件等,但还好最终还是解决解决。回过头来看,其实遇到问题换个角度,打开思维才是最重要的。

基于.net core实现项目自动编译、并生成nuget包的更多相关文章

  1. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  2. 在VS中自动生成NuGet包以及搭建自己的或单位内部的NuGet服务器

    关于NuGet的介绍已经很多,可以参考下面的: NuGet学习笔记(1)--初识NuGet及快速安装使用 http://kb.cnblogs.com/page/143190/ NuGet学习笔记(2) ...

  3. 用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档.

  4. Nodejs+Grunt配置SASS项目自动编译

    Nodejs+Grunt配置SASS项目自动编译 早前听说Nodejs和Grunt很强大,特别是用来构建自动化的前端开发,更是强大无比.但一直碍于自己掌握的技术有限,不敢深入,也未曾深入下去.最近在开 ...

  5. 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)

    最近在使用之前自己编写的批处理给.NET Core项目打包时出问题了,发现之前的脚本根本不适用了,折腾了半天,总算解决了.因此在这里分享下经验,并且奉上整理好的脚本. Nuget包这里就不多介绍了,需 ...

  6. 【ASP.NET】VS编译成功后自动生成Nuget包

    在VisualStudio项目中,可以在每次编译成功后自动发布nuget包,具体配置过程如下:   1.下载nuget.exe,放置在Visual Studio项目的根目录下.   2.通过命令行生成 ...

  7. .Net core 如何生成Nuget包

    以前引用了很多neget包,觉得nuget包方便了很多,是不是有些通用的代码可以封装到nuget中,想要用的时候引用就可以了, 这样其实有两个好处: 1. 首先不用重复的coding,节约了时间. 2 ...

  8. 【Vue】基于nodejs的vue项目打包编译部署

    一·项目编译 1·进入项目目录下的终端执行命令 npm run build 正常情况如下图,如遇到错误不会编译成功,且编译后的html文件不能正常渲染. 2·编译完成后进入项目下的dist目录运行生成 ...

  9. 03.pipeline实现项目自动编译docker镜像自动打包

    https://jenkins.io/zh/doc/book/pipeline/ 官方教程,可以中文.Jenkinsfile就是把pipeline内容保存到文件,然后提交到svn等版本控制库中.安装b ...

随机推荐

  1. 数据包接收系列 — IP协议处理流程(一)

    本文主要内容:在接收数据包时,IP协议的处理流程. 内核版本:2.6.37 Author:zhangskd @ csdn blog IP报头 IP报头: struct iphdr { #if defi ...

  2. SharePoint JS感悟-js脚本

    最近有些迷恋js脚本,因为自己对Asp.net不够熟悉,又是Moss的一年级新生,不是对代码开发不感兴趣,面向对象自己也了解一些,代码也能大致读懂,个人觉得还是经验积累,作为代码开发人员,还是需要3- ...

  3. 自定义蜘蛛网图 NetView

    概述 写论文忙里偷闲写了一个蜘蛛网图的自定义view,支持多重属性 有图才能有真相,下面先上图 主要支持网格颜色.tag文本.覆盖区域颜色.透明度的属性改变,具体使用可以参见我的githubgithu ...

  4. MQ队列管理器搭建(二)

    MQ级联方式使用场景 使用场景:     如上图所示,Application1与Application2要进行通信或者消息互换,使用MQ中间件作为中介.上图中,Application1与Applica ...

  5. kubernetes-dashboard(1.8.3)部署与踩坑

    Kubernetes Dashboard 是一个管理Kubernetes集群的全功能Web界面,旨在以UI的方式完全替代命令行工具(kubectl 等). 目录 部署 创建用户 集成Heapster ...

  6. Spring中对象和属性的注入方式

    一:Spring的bean管理 1.xml方式 bean实例化三种xml方式实现 第一种 使用类的无参数构造创建,首先类中得有无参构造器(重点) 第二种 使用静态工厂创建 (1)创建静态的方法,返回类 ...

  7. DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=2 (转载)

    http://blog.csdn.net/xiyuan1999/article/details/5706230 DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, ...

  8. 如何写jquery插件

      首页    新文章  联系  管理  订阅  自己写一个 jQuery 插件 我知道这一天终将会到来,现在,它来了. 需求 开发 SharePoint 的 CSOM 应用时,经常需要在网页上输出一 ...

  9. Java 学习资料整理

    Java 学习资料整理 Java 精品学习视频教程下载汇总 Java视频教程 孙鑫Java无难事 (全12CD) Java视频教程 即学即会java 上海交大 Java初级编程基础 共25讲下载 av ...

  10. JS基础:this的指向以及call、apply的作用

    this 的指向 在具体的实际应用中,this 的指向无法在函数定义时确定,而是在函数执行的时候才确定的,根据执行时的环境大致可以分为以下3种: 1.当函数作为普通函数调用时,this 指向全局对象 ...