.NET Core,.NET标准和跨解决方案的传递依赖关系

时间:2018-03-24 19:54:21

标签: c# .net-core .net-standard-2.0

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

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

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

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

    控制台应用程序:

    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);
            }
        }
    }
    

    这两个项目都没有问题。但是,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"
            }
    

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

1 个答案:

答案 0 :(得分:2)

我在多个解决方案中使用了一个庞大而复杂的库,并且该库具有许多传递依赖项。

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

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

最后,回到Visual Studio,转到工具 - &gt;选项 - &gt; NuGet包管理器 - &gt; Package Sources并将该顶级文件夹添加为包源。

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