.NET Core、.NET Standard 和跨解决方案的传递依赖项

Lan*_*onC 5 c# .net-core .net-standard-2.0

我的问题类似于this one,虽然它并没有真正解决我的问题。

我正在研究一些新的 AWS Lambda 函数,我希望将它们的实现保留在单独的类库中以供重用。我正在使用两种解决方案测试这个概念:

  1. 具有单个 .NET Standard 类库项目的解决方案。该类库引用了 HTML Agility Pack。
  2. 具有单个 .NET Core 2.0 控制台应用程序项目的解决方案。

类库:

using System;
using HtmlAgilityPack;

namespace ClassLibrary1
{
    public class Class1
    {
        public static bool FoundDotNet(string html)
        {
            bool foundDotNet = false;

            HtmlDocument document = new HtmlDocument();
            document.LoadHtml(html);
            var titleNode = document.DocumentNode.SelectSingleNode("//title");
            if (titleNode != null)
            {
                string titleText = titleNode.InnerText;
                if (titleText.ToLower().Contains(".net"))
                {
                    foundDotNet = true;
                }
            }

            return foundDotNet;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台应用程序:

using System;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var foundDotNet = ClassLibrary1.Class1.FoundDotNet("<html><head><title>.NET WTF Buddy</title></head><body>You're doin' me a confuse.</body></html>");
            Console.WriteLine(foundDotNet);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个项目都没有问题。但是,HTML Agility Pack 程序集未复制到任一项目的 Debug 目录中,当我尝试运行控制台应用程序时,我得到Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'HtmlAgilityPack'

我将两个项目的包管理格式设置为“PackageReference”,我认为这可以正确处理传递依赖。HTML Agility Pack 列在 json.deps 文件中,所以我不确定问题是什么。

"HtmlAgilityPack/1.7.1": {
        "dependencies": {
          "System.Net.Http": "4.3.2",
          "System.Xml.XPath": "4.3.0",
          "System.Xml.XPath.XmlDocument": "4.3.0",
          "System.Xml.XmlDocument": "4.3.0"
        }
Run Code Online (Sandbox Code Playgroud)

如果我将类库项目移动到与控制台应用程序相同的解决方案中,它就可以正常工作。是什么阻止我将代码分成单独的解决方案?

McG*_*V10 3

我在多个解决方案中使用一个大型、复杂的库,并且该库有很多传递依赖项。

首先,设置您的库。右键单击库的项目名称并选择“属性”。大约在中间,您会看到一个标有“Packages”的选项卡。您可以使用它在每次重建项目时自动生成 NuGet 包。只需增加版本号即可。我使用四位置版本编号 - 前三个是semver 样式(主要版本、次要版本、补丁版本),第四个位置是我为每个新版本手动递增的。

我建议在驱动器或网络上专门为本地 NuGet 包创建一个文件夹。您可以在该文件夹下为每个项目创建文件夹。然后,将调试和发布构建输出指向该项目文件夹,NuGet 包也将在那里生成。

最后,返回 Visual Studio,转到“工具”->“选项”->“NuGet 包管理器”->“包源”,然后将该顶级文件夹添加为包源。

从那里开始就很简单了——在您的消费应用程序中打开您的 NuGet 依赖项。右上角有一个下拉菜单,您可以在其中选择包源。它将自动搜索所有子文件夹并查找您创建的任何包。现在,当您调整库时,只需单击一下即可更新客户端应用程序。