# 托普瑞控制库发布脚本 请在 chcp 65001下运行 # 配置参数 - 基本设置 # 使用PSScriptRoot获取脚本所在目录 $scriptDir = $PSScriptRoot $output = Join-Path $scriptDir "Output" $server = "http://47.111.181.23:8081/repository/nuget-releases/" $key = "admin:admin" $actualDllName = "JoyD.Windows.CS.Toprie.dll" # 从AssemblyInfo.cs获取版本号 $assemblyInfoPath = "$scriptDir\Toprie\Properties\AssemblyInfo.cs" Write-Host "正在从 $assemblyInfoPath 获取版本号..." if (-Not (Test-Path $assemblyInfoPath)) { Write-Host "错误: 找不到AssemblyInfo.cs文件!" -ForegroundColor Red exit 1 } # 读取文件内容并提取AssemblyFileVersion $assemblyInfoContent = Get-Content $assemblyInfoPath -Raw $versionMatch = [regex]::Match($assemblyInfoContent, '\[assembly: AssemblyFileVersion\("([\d\.]+)"\)\]') if (-Not $versionMatch.Success) { Write-Host "错误: 无法从AssemblyInfo.cs中提取版本号!" -ForegroundColor Red exit 1 } $version = $versionMatch.Groups[1].Value Write-Host "成功获取版本号: $version" -ForegroundColor Green # NuGet包元数据配置 - 在此处修改所有元数据 $packageId = "com.joyd.toprie" $title = "托普瑞热像仪控制库" $authors = "曾庆明" $owners = "JoyD Technology" $description = "托普瑞热像仪控制库,提供热像仪设备的连接、配置和数据获取功能" $copyright = "Copyright 2025 JoyD Technology" $tags = @("thermal", "camera", "toprie", "红外", "热像仪", "控制") $projectUrl = "https://github.com/joyd/toprie-library" $licenseUrl = "https://opensource.org/licenses/MIT" $iconFileName = "Toprie.png" $iconSourcePath = Join-Path $scriptDir $iconFileName $iconUrl = "http://47.111.181.23:8081/repository/gradle/main/Toprie.png" $releaseNotes = "初始版本发布" # 其他设置 $nupkgFileName = "$packageId.$version.nupkg" $nupkgFilePath = Join-Path $output $nupkgFileName Write-Host "========== 托普瑞库发布开始 ==========" # 创建输出目录 if (!(Test-Path $output)) { New-Item -ItemType Directory -Path $output -Force | Out-Null Write-Host "已创建输出目录: $output" } else { Write-Host "使用现有输出目录: $output" } # 定义pdb和xml文件名称 $actualPdbName = $actualDllName -replace "\.dll$", ".pdb" $actualXmlName = $actualDllName -replace "\.dll$", ".xml" # 清理之前的构建文件 Write-Host "清理之前的构建文件.." if (Test-Path "$output\$actualDllName") { Remove-Item -Path "$output\$actualDllName" -Force } if (Test-Path "$output\$actualPdbName") { Remove-Item -Path "$output\$actualPdbName" -Force } if (Test-Path "$output\$actualXmlName") { Remove-Item -Path "$output\$actualXmlName" -Force } if (Test-Path "$output\$nupkgFileName") { Remove-Item -Path "$output\$nupkgFileName" -Force } if (Test-Path "$output\$packageId.nuspec") { Remove-Item -Path "$output\$packageId.nuspec" -Force } # 构建项目(确保生成pdb和xml文件) Write-Host "1. 正在构建项目..." Write-Host "当前目录: $scriptDir" dotnet build "$scriptDir\Toprie\Toprie.csproj" -c Release -o "$output" /p:DebugSymbols=true /p:DebugType=full /p:DocumentationFile=JoyD.Windows.CS.Toprie.xml if ($LASTEXITCODE -ne 0) { Write-Host "错误: 构建失败!" -ForegroundColor Red exit 1 } # 验证DLL是否存在 if (!(Test-Path "$output\$actualDllName")) { Write-Host "错误: 在输出目录中找不到$actualDllName!" -ForegroundColor Red exit 1 } # 直接使用原始文件名,无需复制重命名 Write-Host "使用原始文件名: $actualDllName" # 复制图标文件到输出目录 if (Test-Path $iconSourcePath) { Copy-Item -Path $iconSourcePath -Destination (Join-Path $output $iconFileName) -Force Write-Host "已复制图标文件到输出目录: $iconFileName" } else { Write-Host "警告: 图标文件 $iconSourcePath 不存在,将使用默认图标" -ForegroundColor Yellow } Write-Host "2. 准备打包文件..." # 在Output目录创建NuGet.Config文件,这样dotnet nuget push命令就能正确找到它 $localNugetConfigPath = Join-Path -Path $output -ChildPath "NuGet.Config" # 创建包含全面配置的NuGet.Config文件 $nugetConfigContent = @" "@ # 设置配置文件 Set-Content -Path $localNugetConfigPath -Value $nugetConfigContent Write-Host "已在Output目录设置NuGet.Config: $localNugetConfigPath" # 创建一个简单的.csproj文件用于打包,无需还原 $tempProjContent = @" net40 $packageId $version $title $authors $owners $description $copyright $tagsString $projectUrl $licenseUrl $iconFileName $releaseNotes . true true true true "@ $tempProjPath = "$output\Temp.csproj" Set-Content -Path $tempProjPath -Value $tempProjContent # 在输出目录中创建包结构 Write-Host "3. 创建NuGet包.." # 在输出目录中创建完整的nuspec文件 $nuspecPath = Join-Path $output "$packageId.nuspec" # 将tags数组转换为空格分隔的字符串 $tagsString = $tags -join " " $nuspecContent = @" $packageId $version $title $authors $owners false $description $releaseNotes $copyright $tagsString $projectUrl $licenseUrl $iconFileName $iconUrl "@ Set-Content -Path $nuspecPath -Value $nuspecContent -Encoding UTF8 Write-Host "已创建nuspec文件: $nuspecPath" # 手动创建nupkg包结构 Write-Host "创建包结构.." $tempDir = Join-Path $output "temp_pkg" # 确保临时目录存在 if (!(Test-Path $tempDir)) { New-Item -ItemType Directory -Path $tempDir -Force | Out-Null } # 创建lib/net40子目录 $libDir = Join-Path $tempDir "lib\net40" if (!(Test-Path $libDir)) { New-Item -ItemType Directory -Path $libDir -Force | Out-Null } # 复制DLL到包结构中 $sourceDllPath = Join-Path $output $actualDllName $destDllPath = Join-Path $libDir $actualDllName Copy-Item -Path $sourceDllPath -Destination $destDllPath -Force Write-Host "已复制$sourceDllPath 到$destDllPath" # 复制PDB文件到包结构中 $sourcePdbPath = Join-Path $output $actualPdbName $destPdbPath = Join-Path $libDir $actualPdbName if (Test-Path $sourcePdbPath) { Copy-Item -Path $sourcePdbPath -Destination $destPdbPath -Force Write-Host "已复制$sourcePdbPath 到$destPdbPath" } # 复制XML文件到包结构中 $sourceXmlPath = Join-Path $output $actualXmlName $destXmlPath = Join-Path $libDir $actualXmlName if (Test-Path $sourceXmlPath) { Copy-Item -Path $sourceXmlPath -Destination $destXmlPath -Force Write-Host "已复制$sourceXmlPath 到$destXmlPath" } # 复制图标文件到包结构根目录 $sourceIconPath = Join-Path $output $iconFileName $destIconPath = Join-Path $tempDir $iconFileName if (Test-Path $sourceIconPath) { Copy-Item -Path $sourceIconPath -Destination $destIconPath -Force Write-Host "已复制图标文件到包结构: $destIconPath" } else { Write-Host "警告: 在输出目录中找不到图标文件 $sourceIconPath" -ForegroundColor Yellow } # 创建[Content_Types].xml文件(有效nupkg必需) $contentTypesPath = Join-Path $tempDir "[Content_Types].xml" # 使用-LiteralPath参数避免方括号被解释为通配符 Set-Content -LiteralPath $contentTypesPath -Value "" Write-Host "已在 $contentTypesPath 创建[Content_Types].xml" # 复制nuspec文件到包结构根目录 $sourceNuspecPath = Join-Path $output "$packageId.nuspec" $destNuspecPath = Join-Path $tempDir "$packageId.nuspec" if (Test-Path $sourceNuspecPath) { Copy-Item -Path $sourceNuspecPath -Destination $destNuspecPath -Force Write-Host "已复制nuspec文件到包结构: $destNuspecPath" } else { Write-Host "警告: 找不到nuspec文件 $sourceNuspecPath" -ForegroundColor Yellow } # 创建zip文件并将其重命名为nupkg $zipPath = Join-Path $output "temp_manual.zip" # 清理任何现有文件 if (Test-Path $zipPath) { Remove-Item -Path $zipPath -Force Write-Host "已移除现有的zip文件" } if (Test-Path $nupkgFilePath) { Remove-Item -Path $nupkgFilePath -Force Write-Host "已移除现有的nupkg文件" } Write-Host "从$tempDir\* 创建zip归档到$zipPath..." Compress-Archive -Path "$tempDir\*" -DestinationPath $zipPath -Force if (Test-Path $zipPath) { Write-Host "正在将$zipPath 重命名为 $nupkgFilePath..." Rename-Item -Path $zipPath -NewName $nupkgFileName -Force if (Test-Path $nupkgFilePath) { $nupkgFile = Get-Item $nupkgFilePath Write-Host "✅ 成功创建包: $($nupkgFile.FullName)" Write-Host "包大小: $([math]::Round($nupkgFile.Length / 1KB, 2)) KB" } } # 清理临时文件夹 Remove-Item -Path $tempDir -Recurse -Force Write-Host "已清理临时文件夹" # 检查包文件是否存在 if (Test-Path $nupkgFilePath) { $nupkgFile = Get-Item $nupkgFilePath Write-Host "找到包文件: $($nupkgFile.FullName)" Write-Host "4. 正在发布包到仓库..." # 使用curl直接发布到HTTP仓库 Write-Host "使用curl直接发布到HTTP仓库..." # 构建curl命令 $curlCommand = "curl.exe -X PUT -u $key -F package=@$nupkgFilePath $server" Write-Host "正在执行: $curlCommand" # 执行curl命令(使用curl.exe避免PowerShell别名冲突) & curl.exe -X PUT -u $key -F package=@$nupkgFilePath $server if ($LASTEXITCODE -eq 0) { Write-Host "✅ 成功: 包发布成功" -ForegroundColor Green Write-Host "包ID: $packageId" Write-Host "版本: $version" Write-Host "标题: $title" Write-Host "作者: $authors" Write-Host "所有者: $owners" Write-Host "描述: $description" Write-Host "标签: $tagsString" Write-Host "仓库: $server" } else { Write-Host "❌ 错误: 包创建成功但发布失败" -ForegroundColor Red Write-Host "包文件位置: $($nupkgFile.FullName)" Write-Host " 您可以尝试手动发布(使用curl命令):" Write-Host "curl -X PUT -u admin:admin -F \"package=@$($nupkgFile.FullName)\" $server" Write-Host " 或者直接在项目中使用创建的包文件" } } else { Write-Host "❌ 错误: 未创建NuGet包" -ForegroundColor Red Write-Host "请检查dotnet CLI是否正确配置" Write-Host "您可以尝试使用Output目录中的文件手动创建包" } # 最终清理 Write-Host "正在执行最终清理.." if (Test-Path "$output\Temp.csproj") { Remove-Item -Path "$output\Temp.csproj" -Force Write-Host "已移除Temp.csproj" } # 删除我们在Output目录创建的NuGet.Config文件 if (Test-Path $localNugetConfigPath) { Remove-Item -Path $localNugetConfigPath -Force Write-Host "已删除临时创建的NuGet.Config" } Write-Host " 发布过程完成"