c# - 在本地测试 nuget 包
问题描述
我正在开发一个使用 nuget 分发其包的 OSS 项目。
今天遇到一个问题,有些项目直接引用还可以,但是因为奇怪的版本错误,无法从nuget恢复。
所以我想防止不可用的代码被合并到主分支中。
我删除了所有本地引用,并创建了以下预构建事件:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn/CodeGeneration.Roslyn.csproj"" />
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn.Attributes/CodeGeneration.Roslyn.Attributes.csproj"" />
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn.Tasks/CodeGeneration.Roslyn.Tasks.csproj"" />
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn.Tool/CodeGeneration.Roslyn.Tool.csproj"" />
</Target>
好的,现在它打包了所有必需的项目。然后我想引用它们。现在我的预构建看起来像:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn/CodeGeneration.Roslyn.csproj"" />
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn.Attributes/CodeGeneration.Roslyn.Attributes.csproj"" />
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn.Tasks/CodeGeneration.Roslyn.Tasks.csproj"" />
<Exec Command=""$(MSBuildBinPath)\msbuild.exe" /t:pack "$(SolutionDir)CodeGeneration.Roslyn.Tool/CodeGeneration.Roslyn.Tool.csproj"" />
<Exec Command="Install-Package CodeGeneration.Attributes -Source "$(SolutionDir)../bin/Packages/$(Configuration)"" />
<Exec Command="Install-Package CodeGeneration.Tasks -Source "$(SolutionDir)../bin/Packages/Packages/$(Configuration)"" />
<Exec Command="Install-Package CodeGeneration.Roslyn -Source "$(SolutionDir)../bin/Packages/Packages/$(Configuration)"" />
<Exec Command="Install-Package dotnet-codegen -Source "$(SolutionDir)../bin/Packages/Packages/$(Configuration)"" />
</Target>
但它不起作用,因为:
安装包:未找到指定搜索条件和包名称“CodeGeneration.Attributes”的匹配项。尝试 Get-PackageSource 以查看所有可用的注册包源。在 line:1 char:1 + Install-Package CodeGeneration.Attributes -Source C:\Users\Alex\Sourc ... + ~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Ex ception + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
似乎它不喜欢预发布包(它们看起来像CodeGeneration.Roslyn.0.4.38-gfe7ce5be9d.nupkg
),好吧,检查文档并尝试添加-IncludePrerelease
标志,但它也不起作用:
安装包:找不到与参数名称“IncludePrerelease”匹配的参数。在 line:1 char:126 + ... os\CodeGeneration.Roslyn\src../bin/Packages/Debug -IncludePrerelease + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Install-Package], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
怎么可能做到?也许还有另一种更简单更好的方法?我已经将其描述得如此详细,因为我不想陷入 XY 陷阱。
解决方案
在本地测试 nuget 包
当我们使用 Visual Studio 构建项目时,构建事件命令行具有与命令提示符相同的环境设置。
但是,该命令Install-Package [-Id] <string> [[-Source] <string>]
应在NuGet 包管理器控制台而不是命令提示符中执行。因为当我们将 nuget 包安装到项目中时,NuGet 会修改项目文件 ( .csproj
) 以包含引用,所以它需要Visual Studio 中的 NuGet API。当我们在 Command Prompt(Build event) 中执行命令行时,nuget 无法访问 Visual Studio 中的 NuGet API,因此通过 build 事件安装 nuget 包将不会成功。
从这个线程检查更多信息。
将nuget 包自动安装到项目的解决方法,您可以使用 Visual Studio 2017(15.3 及更高版本)和引用项目的样式PackageReference
,将Directory.Build.props
文件添加到解决方案的根目录中,文件如下:
<Project>
<ItemGroup>
<PackageReference Include="CodeGeneration.Roslyn" Version="0.4.38-gfe7ce5be9d" />
</ItemGroup>
</Project>
有关更多详细信息,请参阅Martin 的答案。
推荐阅读
- python - 以编程方式为 pd.melt 选择列
- java - 广播接收器未在 Android Pie 中注册(工作)
- android - 如何在奥利奥中杀死应用程序时取消正在进行的通知?
- java - Java:DateTimeFormatter 解析具有不同位数的毫秒时间戳
- airflow - 气流调度程序错误:将线程最大值设置为 1
- bash - 如何修复使用 ssh 执行远程命令的循环
- python - 使用 ClipsPy 以编程方式修改事实槽
- hive - Jinja:调用 Hive (Airflow) 时出现未定义错误
- python - python不会将日期字符串转换为日期时间
- python - 使用 python pandas 如何进行一些分析以识别有效的手机号码