在本地测试nuget包

时间:2018-05-04 13:15:08

标签: c# .net visual-studio msbuild nuget

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

今天我遇到了一个问题,即当你直接引用它们时某些项目很好,但由于版本错误很奇怪,它们无法从nuget恢复。

所以我想防止无法使用的代码被合并到master分支中。

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

  <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>

但由于以下原因无效:

  

Install-Package:未找到指定搜索条件的匹配项   和包名'CodeGeneration.Attributes'。 Tr y Get-PackageSource   查看所有可用的注册包源。在行:1个字符:1   + Install-Package CodeGeneration.Attributes -Source C:\ Users \ Alex \ Sourc ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:ObjectNotFound:(Microsoft.Power .... InstallPackage:InstallPackage)[Install-Package],   例外       + FullyQualifiedErrorId:NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

它似乎不喜欢预发布包(它们看起来像CodeGeneration.Roslyn.0.4.38-gfe7ce5be9d.nupkg),好吧,检查文档并尝试添加-IncludePrerelease标志,但它也不起作用:

  

Install-Package:找不到匹配参数的参数   名称'IncludePrerelease'。在行:1个字符:126   + ... os \ CodeGeneration.Roslyn \ src ../ bin / Packages / Debug -IncludePrerelease   + ~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidArgument:(:) [Install-Package],ParameterBindingException       + FullyQualifiedErrorId:NamedParameterNotFound,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

怎么可能呢?也许有另一种方法更简单,更好?我已经详细描述了它,因为我不想陷入X-Y陷阱。

1 个答案:

答案 0 :(得分:1)

  

在本地测试nuget包

使用Visual Studio构建项目时,构建事件命令行具有与命令提示符相同的环境设置。

但是,命令Install-Package [-Id] <string> [[-Source] <string>]应该在 NuGet包管理器控制台而不是命令提示符中执行。因为当我们将nuget包安装到项目中时,NuGet会修改项目文件(.csproj)以包含引用,它需要NuGet API in Visual Studio。当我们在命令提示符(Build事件)中执行命令行时,nuget无法访问Visual Studio中的NuGet API,因此通过构建事件安装nuget包将无法成功。

查看this thread的更多信息。

解决方法自动将nuget包安装到项目中,您可以使用Visual Studio 2017(15.3及更高版本)和PackageReference样式的引用项目,添加{{1}将文件放入解决方案的根目录,文件如:

Directory.Build.props

有关详细信息,请参阅Martin's answer