(使用 nuget.exe 版本 4.9.2 和 Visual Studio 2017 社区版)
我对 nuget.exe 恢复问题感到困惑。我正在使用 Jenkins 构建推送源。我有一个包含单个项目的解决方案,即 Roadmap,它构建得很好,包括使用
nuget.exe restore "test.sln"
恢复 nuget 包。我的 Jenkins 构建总是从空目录开始。
现在我有第二个项目。它使用了几个相同的 nuget 包。但是当 Jenkins 在 .sln 文件上运行相同的 nuget.exe 命令时,我收到此错误:
C:\Jenkins\workspace\test>nuget restore "test.sln"
MSBuild auto-detection: using msbuild version '12.0' from 'C:\Program Files (x86
)\MSBuild\12.0\bin\amd64'.
All packages listed in packages.config are already installed.
Invalid restore input. Missing required property 'OutputPath' for project type '
PackageReference'. Input files: C:\Jenkins\workspace\test\Roadtrip\Roadtrip.csproj.
我确实看到解决方案中的两个 .csproj 文件中都设置了 OutputPath。但错误消息并不完全具有误导性。原始的 Roadmap.csproj 针对 nuget 包有如下几行:
<ItemGroup>
<Reference Include="CommonServiceLocator, Version=2.0.4.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.2.0.4\lib\net45\CommonServiceLocator.dll</HintPath>
</Reference>
...
在新的 Roadtrip.csproj 中,等效部分包含
<ItemGroup>
<PackageReference Include="CommonServiceLocator">
<Version>2.0.4</Version>
</PackageReference>
...
无论我使用解决方案 nuget 管理器向一个或两个项目添加包,还是使用每个项目 nuget 管理器添加它们的包,情况都是如此。
从我在网上看到的情况来看,Roadtrip 看起来不错。我不确定它为什么会与 Roadmap 不同。在 Visual Studio 中,可以找到引用,并且两个应用程序都可以运行,正确的 DLL 位于调试和发布目录中。此外,当我在笔记本电脑上运行 nuget.exe 行时,可以检索到软件包。
只有当我在远程 Jenkins 服务器上运行它时,它才会失败。我尝试寻找配置中的差异,但它们没有跳出来,我能找到的相关内容在两者上都匹配。我希望这里有知识渊博的人知道我为什么会看到该错误消息的具体原因。
我非常感谢您的帮助。
更新:我本来打算在早上添加这个,Scott 也提到了这样做……我挑詹金斯的毛病,但詹金斯实际上是在机器上运行的。我可以在笔记本电脑上打开一个 cmd 窗口(不是 MSVC cmd 窗口),清除解决方案包目录和所有 obj/bin 子目录,然后nuget.exe restore test.sln
成功完成。在装有詹金斯的机器上执行相同操作会失败,如上所示……在我添加第二个项目之前,它们曾经工作正常。两者的 nuget 和 Visual Studio 版本相同,两者的 cmd 窗口中的环境变量也相同。
答案1
我在本地恢复时遇到了同样的问题,并且一切按预期进行。但当我尝试在 Jenkins 代理上启动我的工作时,我遇到了同样的问题nuget恢复。
nuget restore pathToProject\MyProject.csproj
Invalid restore input. Missing required property 'OutputPath' for project type 'PackageReference'. Input files: MyProject.csproj
在我的 Jenkins Agent 机器上,我的 Nuget 版本与我机器上的 Nuget 版本相同。MSBuild 与我机器上的 MSBuild 相同。
但nuget 恢复命令在我的代理上启动了另一个 MSBuild 版本。将 MSBuildPath 指定为 MSBuild 版本 15 对我的情况很有帮助。
nuget restore pathToProject\MyProject.csproj -MSBuildPath "pathToMSBuild\MSBuild\15.0\Bin"
或者您可以尝试使用-MSBuildVersion。
据我所知,PackageReference 更改最适合 MSBuild 版本 15。因为它随 Visual Studio 2017 和 MSBuild 15 一起提供。
如果您仍想使用 ProjectReference,并且不恢复到 Packages.Config。使用 MSBuild 15 应该会有所帮助,就我而言,它确实有所帮助。但使用 packages.config 并保持相同的 MSBuild 也应该可以正常工作,不会出现任何问题。
答案2
我的工作答案是,我使用的 Visual Studio / nuget.exe 版本不支持 .csproj 文件中的 PackageReference。我读到过应该支持,但无法解决这个问题。一旦我修改了我的 Roadmap 项目以使用 packages.config 并修改了我的 .csproj 文件以匹配 Roadmap 文件,nuget restore 命令就会按预期工作。