在开发 dotnet tool 时,我将规范编码的库作为 dotnet tool 发布,但是在发布的时候本地进行安装提示DotnetToolReference 项目类型仅可包含 DotnetTool 类 型的引用

因为我的库本身也是作为可被引用的项目库发布的,在发布的时候我选择的库是多个平台的。多个平台的框架的写法请看 让一个 csproj 项目指定多个开发框架 - walterlv

但是这样写的多框架的包如果作为 dotnet tool 发布,那么将会在安装的时候有下面代码提示

error NU1212: dotnetCampus.EncodingNormalior 1.3.0 的项目包组合无效。DotnetToolReference 项目类型仅可包含 DotnetTool 类 型的引用
无法还原工具包。
工具“dotnetcampus.encodingnormalior”安装失败。此故障可能由以下原因导致:

* 你尝试安装预览版,但未使用 --version 选项来指定该版本。
* 已找到具有此名称的包,但是它不是 .NET Core 工具。
* 无法访问所需的 NuGet 源,这可能是由于 Internet 连接问题导致。
* 工具名称输入错误。

有关更多原因(包括强制包命名),请访问 https://aka.ms/failure-installing-tool

英文版本请看下面

error NU1212: Invalid project-package combination for awesome-tool 1.0.0. DotnetToolReference project style can only contain references of the DotnetTool type

dotnet 手工打一个 dotnet tool 包 可以知道一个工具包需要在 nuspec 文件里面包含下面代码

    <packageTypes>
      <packageType name="DotnetTool" />
    </packageTypes>

而在压缩包里面存在 Tools 文件夹,而这个文件夹里面有一个 DotnetToolSettings.xml 文件,如果这个要求不满足,那么在 dotnet core 3.1 的版本将安装失败

也就是调试方法是打开打包出来的 NuGet 包,因为本质 NuGet 包就是压缩文件,解压缩,然后看看是否不符合上面两个点,如果不符合那就是本文说的原因了

解决方法是将 csproj 设置为单框架项目,要求这是一个 dotnet core 框架,然后设置 PackAsTool 和 ToolCommandName 属性,详细请看 dotnet 用 NuGet 将自己的工具作为 dotnet tool 分发

如果我的库同时也是作为依赖库,显然这个方法是不成的,我找了很久没有找到在一个 csproj 里面能做出来的解决方法。但是我可以重新创建一个 csproj 文件,让这个 csproj 文件负责打包工具包。这个还请小伙伴看我的源代码,我原本的文件是 EncodingNormalior.csproj 文件,然后我将这个文件修改为 SDK Style 的格式,修改后请看 EncodingNormalior.csproj 但是这个源代码存在一个问题是需要作为 dotnet framework 4.6.1 的库。这和 dotnet tool 冲突

于是我在相同文件夹再创建一个 dotnetCampus.EncodingNormalior.csproj 就解决了

这个迁移的代码请看 添加自动打包 by lindexi · Pull Request #27 · dotnet-campus/EncodingNormalior

dotnet tool install of local tool fails due to NU1212 · Issue #9775 · dotnet/sdk

.NET Core Global Tools and Gotchas

dotnet 手工打一个 dotnet tool 包

dotnet 用 NuGet 将自己的工具作为 dotnet tool 分发

让一个 csproj 项目指定多个开发框架 - walterlv


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-tool-%E5%AE%89%E8%A3%85%E5%A4%B1%E8%B4%A5%E5%9B%A0%E4%B8%BA%E5%AF%B9%E5%BA%94%E7%9A%84%E5%BA%93%E4%B8%8D%E4%BB%85%E5%8C%85%E5%90%AB%E5%B7%A5%E5%85%B7.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

以下是广告时间

推荐关注 Edi.Wang 的公众号