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

时间:2016-10-21 20:14:12

标签: nuget dnx .net-core

我在Visual Studio 2015中有一个.NET核心项目。在其中,我使用了一个Nuget包,但在找到包中的错误后,我检查了它的源代码并将库项目包含到我的调试解决方案中问题。成功解决问题后,我将修复程序发送到上游,它被接受并发布了新的Nuget软件包版本。所以我去了,从我的解决方案中删除了库项目,并打算将软件包更新到固定版本以继续处理我的项目。 Visual Studio Nuget Package Manager找到了新版本,一切似乎都很好。

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

我删除了项目中的所有用户/临时文件,我删除了project.lock.json文件。使用全局文件搜索,在项目目录下的任何文件中都没有单独出现库项目的文件路径(其源代码在主项目的目录之外检出)。然后我运行dotnet restore,它没有说任何有趣的内容,但它创建了project.lock.json文件,在内部,它将包的旧版本添加为"type": "project" path转到project.jsonmsbuildProject转到完全不同的目录中的xproj文件。

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

2 个答案:

答案 0 :(得分:1)

您必须将解决方案放在单独的目录中,因为VS2015中的.NET Core Projects具有独特的文件系统要求,并且当您将它们放在同一目录中时会表现不佳(每个解决方案都会生成一个隐藏的.vs文件夹,它们最终会重叠。

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

.\Solutions\A\ <-- Directory for Solution A
.\Solutions\B\ <-- Directory for Solution B
.\A\ <-- Project A
.\B\ <-- Project B

这意味着每个解决方案的隐藏.vs文件夹将不再重叠(即解决方案不会共享此内容)

.\Solutions\A\ProjectA.sln
.\Solutions\A\global.json
.\Solutions\A\.vs\

.\Solutions\B\ProjectB.sln
.\Solutions\B\global.json
.\Solutions\B\.vs\

您可以通过本文获得更多信息:Organizing Your Project to Support .NET Framework and .NET Core其中包含一个附加说明:

  

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

     
      
  • 这可以防止在尝试恢复同一目录中的库的包时Visual Studio中的潜在冲突。更多
      信息,请参阅“我的多个项目中的NuGet常见问题解答   相同的文件夹,我如何使用单独的packages.config或project.json
      每个项目的文件?
    “。
  •   
  • 替代方法:在另一个文件夹中创建PCL并引用原始源代码以避免此问题。将PCL放在另一个中   文件夹有一个额外的好处,即没有Visual Studio的用户
      2015年仍然可以在不加载新项目的情况下处理旧项目   溶液
  •   

其他信息

  

此外,您可能希望详细了解.NET Core Tooling in Visual Studio

csproj格式

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

这是dotnet new创建的默认csproj。它使您可以访问属于.NET Core运行时安装的所有程序集,例如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>

如您所见,生成的项目文件定义实际上非常简单,避免使用GUID等复杂值。 project.json到.csproj元素的详细映射列在here

由于改进的.csproj文件支持通配符,因此您不需要项目文件中的完整代码文件列表。这样可以获得出色的工具体验:添加到文件夹的文件将自动显示在解决方案资源管理器中。如果需要,在文件中进行的更改将自动修改项目文件。

enter image description here

NuGet包引用

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

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

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

答案 1 :(得分:0)

注意:此答案已从here

复制

本地项目优先于NuGet包。不过,我不知道这是什么级别。

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

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

您可以查看示例{{3}}。