.NET Core、.NET Standard 和跨解决方案的传递依赖性
.NET Core, .NET Standard and Transitive Dependencies across Solutions
我的问题与此类似,虽然它并没有真正解决我的问题。
我正在研究一些新的 AWS Lambda 函数,我想将它们的实现保存在单独的 class 库中以供重用。我正在使用两种解决方案测试这个概念:
- 具有单个 .NET Standard class 库项目的解决方案。此 class 库引用了 HTML Agility Pack。
- 具有单个 .NET Core 2.0 控制台应用程序项目的解决方案。
Class图书馆:
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 程序集未复制到任何一个项目的调试目录中,当我尝试 运行 控制台应用程序时,我得到 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"
}
如果我将 class 库项目移动到与控制台应用程序相同的解决方案中,它工作正常。是什么阻止我将我的代码分成单独的解决方案?
我在多个解决方案中使用了一个大型、复杂的库,并且该库具有许多个传递依赖项。
首先,设置您的图书馆。右键单击库的项目名称并选择属性。大约在一半的位置,您会看到一个标有 Packages 的选项卡。每次重建项目时,您都可以将其用于 auto-generate NuGet 包。只需增加版本号。我使用四位版本编号——前三个是 semver-style(主要版本、次要版本、补丁版本),第四个我为每个新版本手动递增。
我建议在您的驱动器或网络上专门为您的本地 NuGet 包创建一个文件夹。您可以在其下为每个项目创建文件夹。然后将调试和发布生成输出指向该项目文件夹,NuGet 包也将在那里生成。
最后,返回 Visual Studio,转到工具 -> 选项 -> NuGet 包管理器 -> 包源并将 top-level 文件夹添加为包源。
从这里开始很简单——在您的消费应用中打开您的 NuGet 依赖项。右上角有个drop-down可以选择包源。它会自动搜索所有子文件夹并找到您创建的任何包。现在,当您调整您的库时,只需单击一下即可更新客户端应用程序。
我的问题与此类似
我正在研究一些新的 AWS Lambda 函数,我想将它们的实现保存在单独的 class 库中以供重用。我正在使用两种解决方案测试这个概念:
- 具有单个 .NET Standard class 库项目的解决方案。此 class 库引用了 HTML Agility Pack。
- 具有单个 .NET Core 2.0 控制台应用程序项目的解决方案。
Class图书馆:
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 程序集未复制到任何一个项目的调试目录中,当我尝试 运行 控制台应用程序时,我得到 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"
}
如果我将 class 库项目移动到与控制台应用程序相同的解决方案中,它工作正常。是什么阻止我将我的代码分成单独的解决方案?
我在多个解决方案中使用了一个大型、复杂的库,并且该库具有许多个传递依赖项。
首先,设置您的图书馆。右键单击库的项目名称并选择属性。大约在一半的位置,您会看到一个标有 Packages 的选项卡。每次重建项目时,您都可以将其用于 auto-generate NuGet 包。只需增加版本号。我使用四位版本编号——前三个是 semver-style(主要版本、次要版本、补丁版本),第四个我为每个新版本手动递增。
我建议在您的驱动器或网络上专门为您的本地 NuGet 包创建一个文件夹。您可以在其下为每个项目创建文件夹。然后将调试和发布生成输出指向该项目文件夹,NuGet 包也将在那里生成。
最后,返回 Visual Studio,转到工具 -> 选项 -> NuGet 包管理器 -> 包源并将 top-level 文件夹添加为包源。
从这里开始很简单——在您的消费应用中打开您的 NuGet 依赖项。右上角有个drop-down可以选择包源。它会自动搜索所有子文件夹并找到您创建的任何包。现在,当您调整您的库时,只需单击一下即可更新客户端应用程序。