dotnet core PackageReference与DotNetCliToolReference

The*_*Pea 12 .net-core

我正试图dotnet aspnet-codegenerator从我的命令行开始.我第一次尝试,我得到了错误No executable found matching command "dotnet-aspnet-codegenerator"

我意识到我需要安装aspnet-codegeneratoras"dotnet CLI工具"(如果我将正确的元素包含在csproj文件中,它们的可扩展性模型的一部分允许添加CLI命令<DotNetCliToolReference>.)1

这个答案告诉我<DotNetCliToolReference>我需要哪一个,即<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.1" />它给我留下了几个问题:

  1. 我可以使用命令行而不是手动编辑csproj来安装它吗?
    • 我注意到我可以使用命令安装软件包dotnet add package,但是这增加了<PackageReference>我需要的元素<DotNetCliToolReference>;
    • 即运行该命令会产生这个(错误的)元素: <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.1" />
  2. 这两个元素之间有什么区别?
    • 我可以添加它们<ItemGroup>吗?
    • 当我有一个csproj第一个且只<ItemGroup>包含a时<DotNetCliToolReference>,任何后续dotnet add package命令都会失败: error: Invalid restore input. Invalid restore input. DotnetCliToolReference-BundlerMinifier.Core Input files:.
    • 我的解决方法是:
      1. 删除任何现有DotNetCliToolReference 元素
      2. dotnet add package
      3. 完成后,添加我删除的内容.

1 (我在Visual Studio Code中使用最新的;所以我们使用的是csproj,而不是project.json)

Mar*_*ich 17

  1. 目前DotNetCliToolReference只能通过手工编辑csproj文件来添加项目,有一个CLI命令的功能请求,请访问https://github.com/NuGet/Home/issues/4901

  2. 逻辑上的区别在于PackageReferences将成为应用程序的一部分 - 您可以使用代码中随附的dll,它将与您的应用程序一起部署.DotNetCliToolReference软件包将从Feed中恢复,但不会添加到您应用的"依赖关系图"中.当CLI运行命令时,它会查看csproj文件以通过DotNetCliToolReference项目将命令名称解析为相应的dll文件.

  3. 这两个项目类型在哪个项目组中无关紧要.MSBuild非常动态,您可以根据需要重新排列文件.CLI和NuGet都使用MSBuild API来评估文件并查询项目的项目.

  4. dotnet add package当a DotNetCliToolReference已经存在时,你看到的错误是一个错误,已经修复了即将发布的2.0版本:https://github.com/NuGet/Home/issues/4771

  • 如果您不知道此答案,请搜索如何添加“ Microsoft.EntityFrameworkCore.Tools.DotNet”。不再需要将其添加到&lt;DotNetCliToolReference&gt;中,因为在Core 2.1之后,它现在已成为SDK的一部分。检查[this](https://docs.microsoft.com/en-in/dotnet/core/migration/20-21) (2认同)
  • 而且,由于.NET Core 3.0既有全局工具又有本地工具,因此`DotNetCliToolReference`是一种软弃用的方法 (2认同)