基于.net core实现项目自动编译、并生成nuget包
近期想对自己的项目增加自动编译并生成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文件等,但还好最终还是解决解决。回过头来看,其实遇到问题换个角度,打开思维才是最重要的。
- 基于Jenkins 实现php项目的自动化测试、自动打包和自动部署 推荐
- 基于Delphi的自动编译、生成、文档、打包方案
- Python 3.x基于Svn补丁日志自动生成Java项目补丁包
- ndk-lib实现编译并将生成文件拷贝到项目libs中
- CSC动态编译,监测文件夹下改变(Windows服务形式),自动编译生成dll供web项目使用
- android项目中配置NDK自动编译生成so文件
- 发布Silverlight项目自动生成模板,自动生成Silverlight调用RIA Service实现数据增删查改
- 【ASP.NET】VS编译成功后自动生成Nuget包
- 基于web的全景漫游自动生成加编辑平台的技术实现(二)----krpano窥探
- android项目中配置NDK自动编译生成so文件
- 基于web的全景漫游自动生成加编辑平台的技术实现(三)----krpano主XML文件
- 初探vcIDE背后的秘密-为vc项目写makefile,实现自动独立编译
- 基于maven项目的串烧~(restful风格服务+spring boot的模板渲染+maven插件mybatis generator代码自动生成)
- 基于JavaScript代码实现自动生成表格
- 基于Jenkins 实现php项目的自动化测试、自动打包和自动部署
- Eclipse android项目中配置NDK自动编译生成so文件
- 利用Ant 做Android自动化编译实现自动签名, 以及一次生成多个渠道版本.
- 基于Jenkins 实现php项目的自动化测试、自动打包和自动部署
- ant学习笔记(五)基于单元测试的j2se项目,包括编译、测试、打包、生成报告、上传ftp
- 基于Oracle的EntityFramework的WEBAPI2的实现(四)——自动生成在线帮助文档