dotnetrestore继续使用本地项目而不是nuget包

dotnetrestore继续使用本地项目而不是nuget包,nuget,dnx,.net-core,Nuget,Dnx,.net Core,我在Visual Studio 2015中有一个.NET核心项目。在其中,我使用了一个Nuget包,但在包中发现一个bug后,我检查了它的源代码,并将库项目包含到我的解决方案中,以调试该问题。成功解决问题后,我向上游发送了修复程序,它被接受,并发布了一个新的Nuget包版本。所以我去了,从我的解决方案中删除了库项目,并打算将包更新为固定版本以继续处理我的项目。VisualStudioNuGet软件包管理器发现了新版本,并且在一段时间内一切正常 然而,它没有起作用。每次我尝试更新或重新安装包时,库

我在Visual Studio 2015中有一个.NET核心项目。在其中,我使用了一个Nuget包,但在包中发现一个bug后,我检查了它的源代码,并将库项目包含到我的解决方案中,以调试该问题。成功解决问题后,我向上游发送了修复程序,它被接受,并发布了一个新的Nuget包版本。所以我去了,从我的解决方案中删除了库项目,并打算将包更新为固定版本以继续处理我的项目。VisualStudioNuGet软件包管理器发现了新版本,并且在一段时间内一切正常

然而,它没有起作用。每次我尝试更新或重新安装包时,库项目都会重新出现在我的解决方案中,而不仅仅是转到nuget包依赖项。(显然,它仍然包含我的签出版本,而不是当前的nuget软件包版本,因此会出现NU1007警告–指定的依赖项与最终的依赖项不同。)

我已经删除了项目中的所有用户/临时文件,我已经删除了
project.lock.json
文件。使用全局文件搜索,库项目的文件路径(其源代码在主项目目录外签出)在我的项目目录下的任何文件中都没有一个外观。然后我运行
dotnet restore
,它没有说任何有趣的话,但是它创建了
project.lock.json
文件,在里面,它添加了包的旧版本,即
“type”:“project”
路径转到它的
project.json
msbuildProject
转到完全不同目录中的xproj文件

dotnet
在哪里记住/找到路径?它应该这样做吗?我该怎么做才能阻止它这样做,而是重新开始使用标准的Nuget软件包源?

注意:这个答案是从

本地项目优先于NuGet包。不过,我不知道这是在什么层次上烤出来的

解决方案是在
project.json
中明确指定要引用NuGet包,而不是同一解决方案中的项目

"YourNuGetPackageName": {
    "type": "package",
    "version": "VersionOfYourNuGetPackage"
}

您可以看一个例子。

您必须将解决方案放在单独的目录中,因为VS2015中的.NET核心项目具有独特的文件系统要求,并且当您将它们放在同一目录中时,它们的性能会很差(每个解决方案将生成一个隐藏的
.vs
文件夹,并且它们最终会重叠)

例如,您可以将目录结构更改为:

.\Solutions\A\ <-- Directory for Solution A
.\Solutions\B\ <-- Directory for Solution B
.\A\ <-- Project A
.\B\ <-- Project B
您可以通过本文获得更多信息:其中包含一个附加说明:

project.json
重命名为
{project name}.project.json

  • 这可以防止在Visual Studio中尝试还原同一目录中库的包时发生潜在冲突。有关更多信息
    有关详细信息,请参阅NuGet常见问题解答中的“我在 同一个文件夹,如何使用单独的packages.config或project.json
    每个项目的文件?”
  • 备选方案:在另一个文件夹中创建PCL,并参考原始源代码以避免此问题。将PCL放入另一个
    对于没有Visual Studio的用户,文件夹还有一个额外的好处
    2015仍然可以在旧项目上工作,而无需加载新项目
    解决方案

补充资料 此外,您可能想阅读更多关于

csproj格式 csproj文件格式已大大简化,使其对命令行体验更加友好。如果您熟悉project.json,可以看到它包含非常相似的信息。它还支持通配符语法,以避免列出单个源文件

这是dotnet new创建的默认csproj。它使您能够访问作为.NET核心运行时安装一部分的所有程序集,例如System.Collections。它还提供对.NET Core SDK附带的所有工具和目标的访问

<Project>
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="**\*.cs" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.App" Version="1.0.0" />
    <PackageReference Include="Microsoft.NET.SDK" Version="1.0.0" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Exe
netcoreapp1.0
如您所见,生成的项目文件定义实际上非常简单,避免了使用复杂的值,例如guid。下面列出了project.json到.csproj元素的详细映射

由于改进的.csproj文件支持通配符,因此不需要在项目文件中完整列出代码文件。这提供了一个很好的工具体验:添加到文件夹中的文件将自动显示在解决方案资源管理器中。如果需要,在文件中所做的更改将自动修改项目文件

NuGet包引用 您可以在csproj格式中添加NuGet包引用,而无需在具有特殊格式的单独文件中指定它们。NuGet包引用采用以下形式:

例如,如果要将上面项目中的引用添加到,只需将以下行添加到其他两个包引用:

  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.App" Version="1.0.0" />
    <PackageReference Include="Microsoft.NET.SDK" Version="1.0.0" />
    <PackageReference Include="WindowsAzure.Storage" Version="7.2.1" />
  </ItemGroup>


我也有这个问题,这很烦人,等待回复问题,这引起了这里的注意。说吧,你赢了!这很有效。不过,令人遗憾的是,微软在对旧版本没有影响的情况下,却开始将文件夹结构强加给我们。
  <ItemGroup>
    <PackageReference Include="Microsoft.NETCore.App" Version="1.0.0" />
    <PackageReference Include="Microsoft.NET.SDK" Version="1.0.0" />
    <PackageReference Include="WindowsAzure.Storage" Version="7.2.1" />
  </ItemGroup>