我正在开发一个使用nuget分发其软件包的OSS项目。
今天我遇到了一个问题,即当你直接引用它们时某些项目很好,但由于版本错误很奇怪,它们无法从nuget恢复。
所以我想防止无法使用的代码被合并到master分支中。
我删除了所有本地引用,并创建了以下预构建事件:
<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>
但由于以下原因无效:
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陷阱。
答案 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。