在離線環(huán)境使用nuget包
原來程序集的引用
一個項目所有功能我們不可能都自己寫對吧。這個時代 引用一大片的第三方包 項目源文件幾百兆 ,有可能第三方包占了總體積99%。有可能我們自己寫的代碼不過幾十行。想想我們原來的 老時代的 ,如何引用一個第三方的組件,新建項目 項目節(jié)點(diǎn)上 右鍵 添加dll引用:


然后 在代碼里你就可以編寫代碼,有的還有可能額外的給你加點(diǎn)啥配置文件:
1 static void Main(string[] args) 2 { 3 List<int> ali = new List<int>() { 1, 2, 5, 65, 23 }; 4 string serialStr = JsonConvert.SerializeObject(ali); 5 Console.WriteLine(serialStr); 6 }
為什么你知道這樣用 因?yàn)榈谌綆旃俜降氖褂梅绞骄褪沁@么寫的。
新的方式
上面那一套有些跟不上時代了。在python里你都看到 install xxx ,instal xxx 一句話解決。vs也有 那就是 nuget 。直接打開程序包管理器控制臺:
PM> Install-Package Newtonsoft.Json 正在嘗試收集與目標(biāo)為“.NETFramework,Version=v4.6.1”的項目“ConsoleApp2”有關(guān)的包“Newtonsoft.Json.13.0.3”的依賴項信息 收集依賴項信息花費(fèi)時間 45.89 ms 正在嘗試解析程序包“Newtonsoft.Json.13.0.3”的依賴項,DependencyBehavior 為“Lowest” 解析依賴項信息花費(fèi)時間 0 ms 正在解析操作以安裝程序包“Newtonsoft.Json.13.0.3” 已解析操作以安裝程序包“Newtonsoft.Json.13.0.3” 從“nuget.org”檢索包“Newtonsoft.Json 13.0.3” GET https://www.nuget.org/api/v2/package/Newtonsoft.Json/13.0.3 OK https://www.nuget.org/api/v2/package/Newtonsoft.Json/13.0.3 1996 毫秒 正在安裝 Newtonsoft.Json 13.0.3。 正在將程序包“Newtonsoft.Json.13.0.3”添加到文件夾“C:\Users\真紅\Source\Repos\ConsoleApp2\packages” 已將程序包“Newtonsoft.Json.13.0.3”添加到文件夾“C:\Users\真紅\Source\Repos\ConsoleApp2\packages” 已將程序包“Newtonsoft.Json.13.0.3”添加到“packages.config” 已將“Newtonsoft.Json 13.0.3”成功安裝到 ConsoleApp2 執(zhí)行 nuget 操作花費(fèi)時間 7.87 sec 已用時間: 00:00:09.5098825 PM>
或者直接使用圖形化方式選擇安裝:

在離線環(huán)境使用nuget
如果在外網(wǎng)新建項目 然后安裝了某些 nuget包 ,你的.sln 文件同級目錄會有個packages文件夾,那么整個解決方案直接拷貝到內(nèi)網(wǎng) 直接就可編譯(其實(shí)背后本質(zhì)也是引用dll 然后你nuget安裝 就自動幫你完成了,你可以理解為這些依賴關(guān)系和配置文件規(guī)格等等信息在nuget包里已經(jīng)定義好了 然后你執(zhí)行nuget安裝時幫你轉(zhuǎn)達(dá)完成),沒錯就是你項目右鍵 添加引用 選dll文件,只不過nuget幫你完成這一過程。我們可以把packages文件夾 內(nèi)的組件搜集到一起 供內(nèi)網(wǎng)新建項目時 其他項目進(jìn)行引用。首先把packages里的組件搜集到一個統(tǒng)一文件夾。然后工具->nuget包管理器->管理解決方案的nuget程序包。在程序包源那 設(shè)置那里加 本地搜集的目錄。這時瀏覽選項卡就可以看到組件列表了。
然后選擇像常規(guī)方式一樣安裝到內(nèi)網(wǎng)新建的項目就可以了。


安裝后會在項目生成 一個packages.config 里面有項目安裝了的對應(yīng)的包的項。

并不只是添加dll程序集引用 ,對于要在app.config添加一些奇奇怪怪配置項的 ,如果有nuget包 會自動幫你完成。比如sqlite 的provider配置項 。否則的化你需要對那個組件非常了解(有可能組件不止一個dll,有可能有些未知的配置項你手敲不一定敲的對,有可能依賴最低.net版本或者依賴另一個組件等等)

這整個過程無需連外網(wǎng)。
概念總結(jié)和注意項
注意我們整個過程:在外網(wǎng)安裝并搜集所有的包->拷貝包到離線環(huán)境->設(shè)置離線環(huán)境nuget源為拷貝的路徑->像常規(guī)一樣使用包文件nuget又從本地源安裝到項目目錄下。 nuget安裝完成后 整個工程的狀態(tài) 就跟你原來添加dll引用 完成后整個工程的狀態(tài)一樣了, 你可以理解為這個時候不存在nuget。nuget安裝并沒有什么跟原來特別不一樣的項目結(jié)構(gòu)更改方式。項目不能編譯就是不能編譯 不要扯什么nuget 跟nuget 無關(guān)。
- 我能把packages包拷到 項目文件夾下 ,然后編輯packages.config 然后編譯時他就會自動去找對應(yīng)的文件進(jìn)行編譯嗎?不要形成拷貝nuget包到本地 改配置文件 就能重新編譯了的錯誤概念。這個理解是完全錯的。抱歉,編譯時不會進(jìn)行nuget任何操作 不會進(jìn)行加dll引用這種操作。原先nuge安裝了模塊的項目 那么引用是自動加好了的,那么整個項目拷到內(nèi)網(wǎng) 一樣可編譯。
- 內(nèi)網(wǎng)唯一能做的 找內(nèi)網(wǎng)nuget源 安裝模塊,也不存在什么原來安裝了 現(xiàn)在丟失了 需要重新安裝的說法。
- nuget不需要所謂服務(wù)器的說法:本地你指定個文件夾就可以當(dāng)作源。
由此帶來的思考
這又是我擅長的環(huán)節(jié)了,寫代碼不咋行,扯閑淡講經(jīng)布道指點(diǎn)江山一套一套的。為什么? 我們直接手工點(diǎn)來點(diǎn)去 項目上右鍵 添加dll引用 ,有什么不好 ,有些人會說 不是挺好的嗎?確實(shí) ,不要強(qiáng)行裝逼 ,這樣沒什么不好的 因?yàn)槭止c(diǎn)來點(diǎn)去顯得很low所以就不好嗎?
但是為什么又要發(fā)展成nuget發(fā)展成命令行安裝這樣?一切都是軟件工業(yè)技術(shù)發(fā)展過后人的思維的使然 :當(dāng)一個東西大了后自然需要規(guī)范化 統(tǒng)一化 自動化。跟其他工業(yè)技術(shù)一樣的,沒什么好說的。
當(dāng)你達(dá)到一定經(jīng)驗(yàn)后 你就會幡然醒悟 :其實(shí)本質(zhì)不是事情有什么不好 或者什么不能完成。
站在更高維度看代問題的時候 就會明白:核心思想在于統(tǒng)一規(guī)范和自動化,命令行可以通過腳本 自動化 連接所有過程,這個對于大型項目 是很重要的。
注意平常我們說的 編譯器是編譯器 ,開發(fā)環(huán)境是開發(fā)環(huán)境 ,構(gòu)建工具是構(gòu)建工具,構(gòu)建工具就是幫你把大型軟件從源碼生成至用戶可用的執(zhí)行文件,這一切需要統(tǒng)一規(guī)范和自動化命令行連接作為支撐。 只不過vs幫你把所有東西搞到一起了。
如果有人跟你這么說這么做 但是又說不出原因 因?yàn)榇蠹叶歼@樣 那么他在裝逼。

浙公網(wǎng)安備 33010602011771號