簡體   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