pack-release.ps1 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. # pack-release.ps1
  2. # 支持每个项目独立版本的打包脚本
  3. param(
  4. [switch]$NoBuild,
  5. [string]$OutputDir,
  6. [string[]]$Projects # 可选:指定要打包的项目,不指定则打包所有
  7. )
  8. $ErrorActionPreference = 'Stop'
  9. $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
  10. $RootDir = Split-Path -Parent $ScriptDir
  11. $PropsFile = Join-Path $RootDir 'Directory.Build.props'
  12. $DefaultOutputDir = Join-Path $RootDir 'nupkgs'
  13. $VersionsDir = Join-Path $RootDir 'versions'
  14. function Write-ColorText {
  15. param([string]$Text, [string]$Color = 'White')
  16. Write-Host $Text -ForegroundColor $Color
  17. }
  18. # 读取 Y/N 确认,按Q立即退出,回车默认Y
  19. function Read-Confirm {
  20. param([string]$Prompt)
  21. Write-Host $Prompt -NoNewline
  22. while ($true) {
  23. $key = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
  24. if ($key.Character -eq 'q' -or $key.Character -eq 'Q') {
  25. Write-Host ''
  26. Write-ColorText '已退出' 'Yellow'
  27. exit 0
  28. }
  29. if ($key.Character -eq 'y' -or $key.Character -eq 'Y' -or $key.VirtualKeyCode -eq 13) {
  30. Write-Host 'Y'
  31. return $true
  32. }
  33. if ($key.Character -eq 'n' -or $key.Character -eq 'N') {
  34. Write-Host 'N'
  35. return $false
  36. }
  37. }
  38. }
  39. # 获取项目版本(从 versions/{ProjectName}/v*.md 目录)
  40. function Get-ProjectVersion {
  41. param([string]$ProjectName)
  42. $projectVersionDir = Join-Path $VersionsDir $ProjectName
  43. # 优先使用项目独立版本目录
  44. if (Test-Path $projectVersionDir) {
  45. $versionFiles = @(Get-ChildItem -Path $projectVersionDir -Filter 'v*.md' -ErrorAction SilentlyContinue)
  46. } else {
  47. # 回退到根版本目录
  48. $versionFiles = @(Get-ChildItem -Path $VersionsDir -Filter 'v*.md' -ErrorAction SilentlyContinue)
  49. }
  50. $versions = @($versionFiles | Where-Object { $_.BaseName -match '^v(\d+)\.(\d+)\.(\d+)' } | ForEach-Object {
  51. $fullVersion = $_.BaseName -replace '^v', ''
  52. $baseVersion = $_.BaseName -replace '^v(\d+\.\d+\.\d+).*', '$1'
  53. [PSCustomObject]@{
  54. Name = $fullVersion
  55. Version = [version]$baseVersion
  56. }
  57. } | Sort-Object Version -Descending)
  58. if ($versions.Count -gt 0) {
  59. return $versions[0].Name
  60. }
  61. return $null
  62. }
  63. Write-ColorText "`n========================================" 'Cyan'
  64. Write-ColorText ' Apq.Cfg NuGet 包生成工具' 'Cyan'
  65. Write-ColorText ' 支持独立版本管理' 'DarkCyan'
  66. Write-ColorText "========================================" 'Cyan'
  67. Write-ColorText ' 按 Q 随时退出' 'DarkGray'
  68. Write-ColorText "========================================`n" 'Cyan'
  69. if (-not (Test-Path $PropsFile)) {
  70. Write-ColorText '错误: 找不到 Directory.Build.props 文件' 'Red'
  71. Write-ColorText "路径: $PropsFile" 'Red'
  72. exit 1
  73. }
  74. if (-not (Test-Path $VersionsDir)) {
  75. Write-ColorText '错误: 找不到 versions 目录' 'Red'
  76. Write-ColorText "路径: $VersionsDir" 'Red'
  77. exit 1
  78. }
  79. # 定义所有可打包的项目
  80. $AllProjects = @(
  81. 'Apq.Cfg',
  82. 'Apq.Cfg.Ini',
  83. 'Apq.Cfg.Xml',
  84. 'Apq.Cfg.Yaml',
  85. 'Apq.Cfg.Toml',
  86. 'Apq.Cfg.Env',
  87. 'Apq.Cfg.Redis',
  88. 'Apq.Cfg.Database',
  89. 'Apq.Cfg.Consul',
  90. 'Apq.Cfg.Etcd',
  91. 'Apq.Cfg.Nacos',
  92. 'Apq.Cfg.Apollo',
  93. 'Apq.Cfg.Zookeeper',
  94. 'Apq.Cfg.Vault',
  95. 'Apq.Cfg.SourceGenerator'
  96. )
  97. # 如果指定了项目,则只打包指定的项目
  98. if ($Projects -and $Projects.Count -gt 0) {
  99. $TargetProjects = $Projects
  100. } else {
  101. $TargetProjects = $AllProjects
  102. }
  103. # 设置输出目录
  104. if ([string]::IsNullOrWhiteSpace($OutputDir)) {
  105. $OutputDir = $DefaultOutputDir
  106. }
  107. Write-Host ''
  108. Write-ColorText '将要打包的项目及版本:' 'Cyan'
  109. $projectVersions = @{}
  110. foreach ($project in $TargetProjects) {
  111. $version = Get-ProjectVersion -ProjectName $project
  112. if ($version) {
  113. $projectVersions[$project] = $version
  114. Write-ColorText " - $project @ v$version" 'White'
  115. } else {
  116. Write-ColorText " - $project @ (未找到版本)" 'Yellow'
  117. }
  118. }
  119. Write-Host ''
  120. Write-ColorText "输出目录: $OutputDir" 'Gray'
  121. Write-Host ''
  122. if (-not (Read-Confirm '确认开始打包? ([Y]/N): ')) {
  123. Write-ColorText '已取消' 'Yellow'
  124. exit 0
  125. }
  126. # 创建输出目录
  127. if (-not (Test-Path $OutputDir)) {
  128. New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
  129. Write-ColorText "已创建输出目录: $OutputDir" 'Gray'
  130. }
  131. Write-Host ''
  132. Write-ColorText '开始打包...' 'Cyan'
  133. Write-Host ''
  134. $successCount = 0
  135. $failCount = 0
  136. $generatedPackages = @()
  137. foreach ($project in $TargetProjects) {
  138. $version = $projectVersions[$project]
  139. if (-not $version) {
  140. Write-ColorText "跳过 $project (未找到版本)" 'Yellow'
  141. continue
  142. }
  143. # 查找项目文件
  144. $projectPath = Join-Path $RootDir "$project/$project.csproj"
  145. if (-not (Test-Path $projectPath)) {
  146. Write-ColorText "跳过 $project (项目文件不存在)" 'Yellow'
  147. continue
  148. }
  149. Write-ColorText "打包 $project v$version..." 'Gray'
  150. # 删除当前版本的旧包
  151. $oldPackages = Get-ChildItem -Path $OutputDir -Filter "$project.$version.*pkg" -ErrorAction SilentlyContinue
  152. foreach ($pkg in $oldPackages) {
  153. Remove-Item $pkg.FullName -Force
  154. }
  155. # 构建打包参数
  156. $packArgs = @(
  157. 'pack'
  158. $projectPath
  159. '-c', 'Release'
  160. '-o', $OutputDir
  161. )
  162. if ($NoBuild) {
  163. $packArgs += '--no-build'
  164. }
  165. try {
  166. & dotnet @packArgs 2>&1 | Out-Null
  167. if ($LASTEXITCODE -eq 0) {
  168. $successCount++
  169. $generatedPackages += "$project.$version.nupkg"
  170. Write-ColorText " ✓ $project v$version" 'Green'
  171. } else {
  172. $failCount++
  173. Write-ColorText " ✗ $project 打包失败" 'Red'
  174. }
  175. } catch {
  176. $failCount++
  177. Write-ColorText " ✗ $project 打包异常: $($_.Exception.Message)" 'Red'
  178. }
  179. }
  180. Write-Host ''
  181. Write-ColorText "========================================" 'Cyan'
  182. Write-ColorText "打包完成!" 'Green'
  183. Write-ColorText " 成功: $successCount" 'Green'
  184. if ($failCount -gt 0) {
  185. Write-ColorText " 失败: $failCount" 'Red'
  186. }
  187. Write-ColorText "========================================" 'Cyan'
  188. Write-Host ''
  189. # 列出生成的包
  190. $packages = Get-ChildItem -Path $OutputDir -Filter "Apq.Cfg*.nupkg" -ErrorAction SilentlyContinue | Sort-Object Name
  191. if ($packages.Count -gt 0) {
  192. Write-ColorText '生成的 NuGet 包:' 'Cyan'
  193. foreach ($pkg in $packages) {
  194. $size = [math]::Round($pkg.Length / 1KB, 1)
  195. Write-ColorText " $($pkg.Name) ($size KB)" 'White'
  196. }
  197. Write-Host ''
  198. }
  199. $symbolPackages = Get-ChildItem -Path $OutputDir -Filter "Apq.Cfg*.snupkg" -ErrorAction SilentlyContinue | Sort-Object Name
  200. if ($symbolPackages.Count -gt 0) {
  201. Write-ColorText '生成的符号包:' 'Cyan'
  202. foreach ($pkg in $symbolPackages) {
  203. $size = [math]::Round($pkg.Length / 1KB, 1)
  204. Write-ColorText " $($pkg.Name) ($size KB)" 'White'
  205. }
  206. Write-Host ''
  207. }
  208. Write-ColorText '下一步操作:' 'Yellow'
  209. Write-ColorText ' 运行 push-nuget.bat 发布到 NuGet' 'Gray'
  210. Write-ColorText ' 或指定项目打包: .\pack-release.ps1 -Projects Apq.Cfg,Apq.Cfg.Nacos' 'Gray'
  211. Write-Host ''