.NET Core、.NET Standard以及解决方案间的传递依赖

5
我的问题类似于这个问题:这个,但它并没有真正解决我的问题。
我正在开发一些新的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;
        }
    }
}

控制台应用程序:

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

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

我认为你的csproj文件的内容可能是相关的。 - spender
1
@spender 您指的是内容的哪个部分?能否详细说明一下? - LandonC
1个回答

3

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

首先,设置你的库。右键单击库的项目名称并选择属性。然后,你会看到一个标签页标记为“包”。你可以使用它来每次重新构建项目时自动生成NuGet包。只需增加版本号。我使用四位数的版本编号--前三位是语义化版本控制风格(主要版本、次要版本、补丁版本),第四位我每次新构建时手动增加。

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

最后,在Visual Studio中,转到“工具”->“选项”->“NuGet程序包管理器”->“包源”,并添加该顶级文件夹作为软件包源。

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


谢谢您的建议,但您知道它是否适用于我所概述的特定情况,即 .net Standard/Core 跨解决方案问题吗? - LandonC
是的,这就是我解决传递依赖问题的方法。我的情况是Azure,我没有使用HTML Agility Pack,但我有几个带有各种依赖关系(有时深达几层)的“netstandard20”库被.NET Core和ASP.NET Core应用程序引用。VS无法捕获传递依赖项,但NuGet包可以。 - McGuireV10
这解决了问题,但实际上并没有回答所问的问题。 - Ian Kemp
@IanKemp 因为直接的“答案”是微不足道和显而易见的——那就是VS打包的工作方式。 - McGuireV10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接