已安装的项目特定的NuGet包未被识别

4
我有一个Web项目,由于NuGet错误而无法构建。
我们有许多网站都使用名为Sitecore的Web CMS。不同的网站使用不同的版本。因此,我们有一个通用库,可以针对许多版本进行定位,如这里所述
因此,我有一个如下所示的项目结构。请记住,这是逻辑表示。考虑到所有这些文件都在解决方案的根目录中。
- Common.sln
- Common.SC65.csproj - MyClass.cs [shared] - MyClass.SC65.cs - **packages.Common.SC65.config**
- Common.SC70.csproj - MyClass.cs [shared] - MyClass.SC70.cs - **packages.Common.SC70.config**
- Common.SC72.csproj - MyClass.cs [shared] - MyClass.SC72.cs - **packages.Common.SC72.config**
这是我现在遇到的错误:
``` C:\Path\Website.ProjectSC65\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets(225,5): error : Could not locate C:\Path\Common\packages.config. Ensure that this project has Microsoft.Bcl.Build installed and packages.config is located next to the project file. ```
这让我相信问题出在Bcl targets文件中,它似乎在喊这一行:
<ValidatePackageReferences Packages="@(ValidatePackages)"
                           ReferencingProject="$(BclBuildReferencingProject)"
                           ReferencingProjectPackagesConfig="$(BclBuildReferencingProjectConfig)"
                           ReferencedProject="$(MSBuildProjectFullPath)"
                           ReferencedProjectPackagesConfig="$(MSBuildProjectDirectory)\packages.config"
                           TreatWarningsAsErrors="$(TreatWarningsAsErrors)" />

"Website.ProjectSC65"引用了Common.SC65。

我偶尔会遇到nuget包出现问题的情况,但无论我怎么做都似乎无法解决这个问题。大多数情况下,一些Update-Package -reinstall组合可以解决我的问题。我需要每个项目使用不同的包,因为它们支持不同版本的框架。

我完全意识到它正在寻找一个在技术上不存在的包文件,因为它应该引用'packages.Common.SC65.config'。

更奇怪的是,我现在找不到任何关于引用项目级别依赖项的上述技术的信息。我知道我曾经找到过这个,但我不知道这是否是正确的方法。

所以,我需要知道以下主要事项:

  1. 在我的项目构建中,可能是什么原因导致上述错误,如何修复?
  2. 项目级别上设置nuget包的正确方法是什么?(而不是解决方案级别)

我认为这个消息告诉你它期望csproj和config在同一目录级别; 而你的不是。我还认为,如果你在编辑器中编辑csproj,你可以更改配置文件路径,指向实际存在的位置。我假设你只是将事物从原来的位置移动了。 - Jeff Prince
哦,顺便说一下,“规范”是csproj和config应该在完全相同的级别上。这就是Visual Studio最初创建它们的方式。但我不认为这是绝对必要的(我可能对此有所错误)。如果不是必需的,您可以只更改csproj中的配置路径。 - Jeff Prince
@jeffprince 对不起,那更像是一个逻辑表示。它们都处于同一层级。 - Zachary Dow
好的,我认为您应该回到解决方案的根目录,找到该级别的包目录,并查看repositories.config文件。我怀疑对于您的每个项目,都指定了错误的配置文件名称。 - Jeff Prince
@JeffPrince 对我来说看起来没问题。我的 Web 项目的 repositories.config 文件只引用了自身和 packages.Common.SC65.config。所有形式的公共库只引用 packages.Common.SCXX.config,以及它所依赖的一个库的 packages.config。 - Zachary Dow
2个回答

1
我在 UWP 项目中遇到了相同的错误。按照下面的方法解决了问题。
我检查了正确目录下的 package.config 文件,并且已经安装了 Microsoft.BCL.Build。唯一的解决方法是关闭 Visual Studio,删除解决方案目录中的 obj 文件夹。一旦删除了 obj 文件夹并重新加载了项目,Visual Studio 就能正常工作了。
来源:http://onteorablog.azurewebsites.net/ensure-that-this-project-has-microsoft-bcl-build-installed-and-packages-config-is-located-next-to-the-project-file/

我觉得这解决了很多关于包和版本的问题。我真的希望“清理项目”命令可以自动为我们完成这个任务。 - Ebsan
1
@WiteCastle,很不幸的是,这对许多其他问题也是适用的。如果您遇到奇怪的错误,请删除XF和Droid项目的bin、obj文件夹,清理临时文件夹,清理解决方案并重新构建,然后重新启动VS等。 - Emil

1

好的,看起来在所有情况下都不支持包含项目级配置的技术。

在我的 Web 项目中,我使用了 /packages/Microsoft.Bcl.Build.1.0.14/tools/Microsoft.Bcl.Build.targets 文件并修改了它所抱怨的那一行。

<ValidatePackageReferences Packages="@(ValidatePackages)"
                           ReferencingProject="$(BclBuildReferencingProject)"
                           ReferencingProjectPackagesConfig="$(BclBuildReferencingProjectConfig)"
                           ReferencedProject="$(MSBuildProjectFullPath)"
                           ReferencedProjectPackagesConfig="$(MSBuildProjectDirectory)\packages.config"
                           TreatWarningsAsErrors="$(TreatWarningsAsErrors)" />

我通过替换以下这行代码来实现: ReferencedProjectPackagesConfig="$(MSBuildProjectDirectory)\packages.config" 用以下这行代码代替:
ReferencedProjectPackagesConfig="$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config"

将项目名称注入到属性中确实很有效。如果我从其他库引用了其他只是“packages.config”的NuGet软件包,这可能会在以后引起问题。不过,目前来说,这是一个不错的解决方案。

不过,这种方法感觉非常“hacky(破解式的)”。我很想听听其他答案,特别是那些不涉及修改软件包内部的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接