【问题标题】:dotnet core PackageReference vs DotNetCliToolReferencedotnet core PackageReference 与 DotNetCliToolReference
【发布时间】:2017-05-24 21:49:15
【问题描述】:

我正在尝试从我的命令行运行dotnet aspnet-codegenerator。第一次尝试,报错No executable found matching command "dotnet-aspnet-codegenerator"

我意识到我需要将aspnet-codegenerator 安装为“dotnet CLI 工具”(如果我在 csproj 文件中包含正确的<DotNetCliToolReference> 元素,他们的extensibility model 的一部分允许添加 CLI 命令。)1

This answer 告诉我需要哪个<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> 包含<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)

【问题讨论】:

    标签: .net-core


    【解决方案1】:
    1. 目前添加 DotNetCliToolReference 项目只能通过手动编辑 csproj 文件来实现。该功能在 .NET Core 3.0 中已被弃用,因为它导致了难以调试的奇怪不兼容性。见:https://github.com/dotnet/sdk/issues/3115

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

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

    4. DotNetCliToolReference 已经存在时,您看到dotnet add package 失败的错误是已为即将发布的2.0 版本修复的错误:https://github.com/NuGet/Home/issues/4771

    【讨论】:

    • dotnet add package 将选择最新版本,但您也可以传递像 9.* 这样的通配符,它​​会将这些通配符写入项目文件。但是,这在实践中有点危险,因为当更新包并且您的构建不是“可重现的”时,您可能会得到不同的结果。但它对于预发布版本很有用(例如1.2.3-preview1-*)。
    • 你能详细说明一下 2. 吗? “从提要中恢复”是什么意思?
    • @DavidRefaeli 表示“从配置的提要下载或复制”(取决于 nuget.config 中的内容)
    • 如果您在搜索如何添加“Microsoft.EntityFrameworkCore.Tools.DotNet”时偶然发现此答案。不再需要将其添加到 <DotNetCliToolReference>,因为在 Core 2.1 之后它现在是 SDK 的一部分。检查this
    • 另外,DotNetCliToolReference 有点不推荐使用,因为 .NET Core 3.0 既有全局工具也有本地工具
    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多