繁体   English   中英

package 内容文件 in.nuget package

[英]Cleanest way to package content files in .nuget package

所以我设置了如下所示:

Source.sln 有三个项目 A.csproj、B.csproj 和 utils.csproj。 Both A and B use utils.csproj but I have converted utils.csproj to a nuget package so now A and B both consume utils nuget package instead of a project reference.

接下来我要做的是从机器人 A 和 B 制作 nuget 包。所以现在我有三个 nuget 包

1.A.Nuget(使用 utils.nuget) 2.B.nuget(使用 utils.nuget) 3. Utils.nuget

现在,我有另一个 consumer.csproj,它使用所有三个作为 nuget 引用。

这里的问题是 A.csproj 和 B.csproj 都有运行时需要的 inputA.json 和 inputB.json 文件。 它们根本没有变化,所以最好用 nuget package 包装

我的问题是,什么是最干净的方法来包装它们? 我想到了几个选项,但对其中任何一个都不满意:

  1. 通过指定 in.csproj 文件将它们打包到 utils.nuget 的 /content 文件夹中。 但这里的问题是,从 nuget 读取它们的代码需要从../contents/inputA.json 中引用这些文件,而在开发环境中并非如此。 它们只是驻留在 A.csproj/ 文件夹中,可以引用为“input.json”。 因此,当 consumer.csproj 引用 A.nuget 和 utils.Z0558440846982BFE7FF23B159C377F9 时,在 Visual Studio 上工作的相同代码(将此文件引用为input.json )会中断

    1. 让消费者提供所有这些文件。 这可能是一个选择,但如果可能的话,我想避免它。

    2. 不知何故,想办法将这些文件复制到 utils.nuget 的 /lib 文件夹中,而不是 /contents 中。 我目前正在尝试使用.nuspec 文件来实现这一目标。 但不确定这是否是最干净的解决方案

我可以对这种情况做些什么吗?

在我看来,最好的解决方案是使文件成为嵌入式资源。 由于您说文件不会更改,因此将它们作为磁盘上的文件没有任何好处。 但是,如果您要嵌入它们,您不妨将其转换为代码,这样您的代码就不必浪费 CPU 周期来解析和反序列化 json 文件。

如果您的某些 package 消费者偶尔会想要更改内容,那么我认为让您的 package 具有可扩展的 API 会比拥有配置文件更好。 我不知道您是否使用过 ASP.NET 内核,但我认为他们的配置非常出色。 所有配置都是代码,使用回调。 例如:

app.UseWhateverMiddleware(options => {
  // options contains default values, my app can change the values I care about here
})

这解决了很多问题。 如果您的 package 覆盖项目的内容文件,那么您的包的使用者将失去他们的定制。 如果您的 package 没有覆盖内容文件,那么您没有一个好的方法来更新默认值或向已经使用 package 的项目添加新选项。 根据您的客户是谁,他们可能不高兴被迫通过必须与他们的应用程序一起部署的文件来配置您的库。 特别是对于 web 应用程序,有些人喜欢配置文件,有些人将配置存储在数据库或环境变量中,所有配置都在一个文件中,不同库的不同配置文件,或应用程序不同区域/功能的不同配置文件。

通过使用ASP.NET 核心选项模式,它允许按照项目的需要配置项目,而不是 package 想要的配置。

打包文件并从任何地方读取文件的最干净(本质上不是很干净)基本上是确保这些文件最终位于消费者项目的 /bin 文件夹中。 这样做的方法是使用.nuspec文件。

如果文件在 .nuspec 元数据中映射为 .nuspec 文件:

<metadata> // This path automatically resolves to /contentfiles/any/any <contentFiles> <files include="Yourfilename" buildAction="none" copyToOutput="true"/> </contentFiles> </metadata>

<files> <file src="../path/to/your/file" target="contentFiles\any\any" />
</files>

由于选项CopyToOutput = "true"这些文件将直接复制到引用项目的 /bin 文件夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM