【发布时间】:2017-06-24 20:04:34
【问题描述】:
我正在自动化我的 .NET Standard 项目(VS 2017 的新 csproj 格式)以在构建后生成 nuget 包。
问题是我希望解决方案中的所有项目都遵循我的 AppVeyor 构建版本,而不是在 csprojs 的 Package 属性中设置的版本(默认为 1.0.0)。
要考虑的另一件事是我的项目之间有引用,并且也应该保留 AppVeyor 构建版本。
有简单的方法吗?怎么样?
【问题讨论】:
我正在自动化我的 .NET Standard 项目(VS 2017 的新 csproj 格式)以在构建后生成 nuget 包。
问题是我希望解决方案中的所有项目都遵循我的 AppVeyor 构建版本,而不是在 csprojs 的 Package 属性中设置的版本(默认为 1.0.0)。
要考虑的另一件事是我的项目之间有引用,并且也应该保留 AppVeyor 构建版本。
有简单的方法吗?怎么样?
【问题讨论】:
您可以将版本作为 MSBuild 属性传递给dotnet pack:
dotnet pack MyProject.csproj --configuration Release /p:Version="1.2.3"
(这也适用于dotnet build)
这是FakeItEasy build script 中的一个示例。
要获取 AppVeyor 内部版本号,请使用 APPVEYOR_BUILD_VERSION environment variable。
要考虑的另一件事是我的项目之间有引用,并且也应该保留 AppVeyor 构建版本。
这应该不是问题,因为您没有在 <ProjectReference> 元素中指定版本。
【讨论】:
更新: .NET Core .csproj files patching 和 automatic nuget packaging for .NET Core projects 现在可以使用了。
有几个选项:
使用 PowerShell 手动修补 .NET Standard .csproj 文件。在此示例中,我们更新了版本,但您也可以通过这种方式更新其他设置。
$xmlPath = "$env:appveyor_build_folder\MyProject\MyProject.csproj"
$xml = [xml](get-content $xmlPath)
$propertyGroup = $xml.Project.PropertyGroup | Where { $_.Version}
$propertyGroup.Version = $env:appveyor_build_version
$xml.Save($xmlPath)
msbuild %appveyor_build_folder%\MyProject\MyProject.csproj /t:pack
或者如果你想继续使用.nuspec文件,你可以用这样的命令打包:
msbuild %appveyor_build_folder%\MyProject\MyProject.csproj /t:pack /p:Configuration=%CONFIGURATION%;NuspecFile=MyProject\MyProject.nuspec;PackageVersion=%APPVEYOR_BUILD_VERSION%
当然您可以使用dotnet pack,但我们认为今后msbuild 仍将是主要工具,因此我们尝试使用它来编写所有脚本。
不用说,我们在 AppVeyor 中应该不需要这个脚本,我们在 https://github.com/appveyor/ci/issues/1404 中跟踪它。
【讨论】:
Version 属性。根据this,应该是PackageVersion。
PackageVersion,默认为$(Version)的值,即项目中的属性Version。所以据我了解Version 仍然有效,但PackageVersion 更具体到 Nuget 包装。 补充:我认为对于 AppVeyor 中的自动修补,我们应该提出两个选项来修补并实际修补.csproj中真正存在的内容@
*.csproj 文件,但它不适用于*.fsproj 文件吗?我可以获得对两者都适用的程序集信息修补程序,但 dotnet pack 似乎只适用于 *.csproj 文件。