我这里介绍两种模式,单个nuget包的发布和批量nuget包的发布;
- 先说单个包,先看例图:
解释下红框中标注的代码什么意思:
<isPackable>true</isPackable> // 生成包
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> // 生成时是否自动生成包
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat> // 类型
<RunPostBuildEvent>false</RunPostBuildEvent> // 关闭自动更新功能 这个属性是自定义的,用于下面是否需要自动发布使用,后面会详细说明
<Version>1.0.2.4</Version> // 包版本号
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(RunPostBuildEvent)' == 'true'">
<Exec Command="dotnet pack --configuration $(Configuration)
dotnet nuget push -s 私有nuget服务地址 -k 密码 bin\$(Configuration)\$(ProjectName).$(Version).nupkg" />
</Target>
用了.net的发布后事件,既PostBuildEvent方法,里面执行把包发布到对应私有nuget的打包命令。
Condition="‘$(RunPostBuildEvent)’ == ‘true’"这段命令既代表我们上面自定义的属性条件,为true就代表需要生成时自动发布,为false就代表生成时不会执行这段命令。
注意:这就代表我们每次自动生成后发布成功后,需要手动将这个属性改为false,不然你每次生成时都会进行包更新。
好了,单个包发布就完成了,每次改了代码需要发布这个包时,只需要我们将版本号改一下(加1),然后把RunPostBuildEvent属性改成true,然后重新生成(编译),就可完成发布了。
(再次提醒,发完后,将这个属性改为false,不然你每次编译都会失败,如果你没改版本号的情况下)
如下图,发布后的效果
以上就是单个包的发布了,是不是很简单,现在我们来看批量发包的操作,其实原理是一样的;
- 批量包发布:
一样的,在我们每个要发布的包里面都写上我上面提到的命令代码,然后创建两个Ps1类型的文件,这里执行的是PowerShell脚本文件的方式,
UpdateVersion.Ps1的代码如下:
$folderPath = Join-Path -Path $PSScriptRoot -ChildPath "src" # 替换为包含类库项目的文件夹路径
$projects = Get-ChildItem -Path $folderPath -Filter *.csproj -Recurse
foreach ($project in $projects) {
$projectFilePath = $project.FullName
# 读取项目文件
$projectXml = [xml](Get-Content -Path $projectFilePath)
# 获取当前版本号
$currentVersion = $projectXml.Project.PropertyGroup.Version
# 解析版本号成主版本、次版本、修订号和生成号
$versionParts = $currentVersion -split '\.'
$major = [int]$versionParts[0]
$minor = [int]$versionParts[1]
$revision = [int]$versionParts[2]
$build = [int]$versionParts[3]
# 递增修订号
$build++
# 更新版本号
$newVersion = "$major.$minor.$revision.$build"
$projectXml.Project.PropertyGroup.Version = $newVersion
# 更新 RunPostBuildEvent 字段为 true
$projectXml.Project.PropertyGroup.RunPostBuildEvent = "true"
# 保存更新后的项目文件
$projectXml.Save($projectFilePath)
}
可以看出来其实这个文件的作用就是批量修改src文件夹下面所有包项目文件,将他们的RunPostBuildEvent 属性改为true,同时Version属性版本加1;
CloseBuildEvent.Ps1文件代码如下:
$folderPath = Join-Path -Path $PSScriptRoot -ChildPath "src" # 替换为包含类库项目的文件夹路径
$projects = Get-ChildItem -Path $folderPath -Filter *.csproj -Recurse
foreach ($project in $projects) {
$projectFilePath = $project.FullName
# 读取项目文件
$projectXml = [xml](Get-Content -Path $projectFilePath)
# 更新 RunPostBuildEvent 字段为 false
$projectXml.Project.PropertyGroup.RunPostBuildEvent = "false"
# 保存更新后的项目文件
$projectXml.Save($projectFilePath)
}
这个文件也很明显就是将所有项目文件对应的RunPostBuildEvent 属性改为false;
然后就没了。
执行步骤就是:
- 执行 UpdateVersion.Ps1
- 重新生成所有项目文件
- 执行CloseBuildEvent.Ps1
以上就完成了所有的项目文件打包更新,这种方式比较新奇哈(可能我在网上没看到有用这种方式完成打包更新的),但是我觉得是真的挺方便的,自己能随意控制需不需要发布更新。
题外:在这里说一下很多电脑执行Ps1
类型文件遇到的问题,由于window系统的电脑大部分是不允许手动执行Ps1类型的文件的,(可自己执行试一下)
所以需要我们手动修改一些系统策略,如下步骤:修改执行策略: 在 PowerShell 终端中以管理员身份运行以下命令,将执行策略更改为
“RemoteSigned”,允许运行本地未签名的脚本:
- Set-ExecutionPolicy RemoteSigned
- 如果系统提示确认更改,请输入 “Y” 并按下 Enter。
注意:更改执行策略可能会对系统安全性产生影响,故并确保只允许可信的脚本运行。
仅允许运行当前脚本: 在 PowerShell 终端中以管理员身份运行以下命令,允许当前脚本运行,而不改变全局执行策略:
- Unblock-File -Path “D:\Work\Code\framework\UpdateVersion.Ps1”
将路径 “D:\Work\Code\framework\UpdateVersion.Ps1” 替换为您实际的脚本文件路径。
这将解除对指定脚本文件的锁定,并允许运行该脚本。
总结:有问题可发评论,看到会解决问题,禁止抄袭,转载必须标注原文。