首页 > 解决方案 > 在本地测试 nuget 包

问题描述

我正在开发一个使用 nuget 分发其包的 OSS 项目。

今天遇到一个问题,有些项目直接引用还可以,但是因为奇怪的版本错误,无法从nuget恢复。

所以我想防止不可用的代码被合并到主分支中。

我删除了所有本地引用,并创建了以下预构建事件:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn/CodeGeneration.Roslyn.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Attributes/CodeGeneration.Roslyn.Attributes.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tasks/CodeGeneration.Roslyn.Tasks.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tool/CodeGeneration.Roslyn.Tool.csproj&quot;" />
  </Target>

好的,现在它打包了所有必需的项目。然后我想引用它们。现在我的预构建看起来像:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn/CodeGeneration.Roslyn.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Attributes/CodeGeneration.Roslyn.Attributes.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tasks/CodeGeneration.Roslyn.Tasks.csproj&quot;" />
    <Exec Command="&quot;$(MSBuildBinPath)\msbuild.exe&quot; /t:pack &quot;$(SolutionDir)CodeGeneration.Roslyn.Tool/CodeGeneration.Roslyn.Tool.csproj&quot;" />

    <Exec Command="Install-Package CodeGeneration.Attributes -Source &quot;$(SolutionDir)../bin/Packages/$(Configuration)&quot;" />
    <Exec Command="Install-Package CodeGeneration.Tasks -Source &quot;$(SolutionDir)../bin/Packages/Packages/$(Configuration)&quot;" />
    <Exec Command="Install-Package CodeGeneration.Roslyn -Source &quot;$(SolutionDir)../bin/Packages/Packages/$(Configuration)&quot;" />
    <Exec Command="Install-Package dotnet-codegen -Source &quot;$(SolutionDir)../bin/Packages/Packages/$(Configuration)&quot;" />
  </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 陷阱。

标签: c#.netvisual-studiomsbuildnuget

解决方案


在本地测试 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 的答案。


推荐阅读