當我們使用微服務架構之后,緊接而來的問題便是服務之間的程序集引用問題,可能沒接觸過的同學不太理解這句話,都已經微服務化了為什么還要互相引用程序集,當然可以不引用。但是我們會有這樣一種情況,我們的每個接口都會有請求參數和返回結果,規范來說我們需要為每個接口分別創建一個請求類(Request)和返回類(Response)。當其他服務或者程序需要調用這個接口傳遞參數和得到返回結果的時候,最方便的方式就是直接使用服務的程序集,而不是兩邊同時創建Request和RResponse。同時我們還需要對程序集進行版本控制,而且高本版需要兼容低版本。通過NuGet來進行程序集的使用和版本控制是一件百利而無一害的事,我現在所在的公司便是使用這種方式。
這里說一下我被dll版本坑哭的經歷,同時也為現在到處拷貝dll的同學做個提示。我現在的公司架構是從三層改造到微服務的,所以在Web端依然存在着部分三層代碼,不同項目之間進行的程序集使用是通過拷貝dll的形式(這里有兩個三層項目,還沒有完全服務化),A項目中使用了某個服務的程序集,B項目中也使用了該服務的程序集,此時把A項目類庫的dll拷貝到B項目中,如果兩個相同服務的程序集版本不一致,恭喜你,等着報錯吧兄弟(想到這里我就要哭了,第一次不知道被坑慘了,補了一晚上的數據) !!當然你可能會說難道你拷貝完都不測試的嗎,我們自己的開發組現在有40多個服務,同時還引用了其它組的服務,當時那個項目里有十七八個服務的程序集,一堆人開發,一方面我當時不知道這個坑,另一方面我也沒去看代碼提交記錄誰升級了某個服務的版本,結果發布還沒2分鍾,大量日志報警襲來:xxx程序集版本未找到!!唉,當晚補數據到凌晨2點,所以,對於程序集的使用,進行規范化的管理是非常有必要的,更重要的是不要拷貝dll!!!
我們這次使用Docker搭建一個自己的NuGet服務器(因為Docker實在太簡單了,我已經懶到無可救葯了):
docker run -d -p 8090:80 -v $PWD/nuget/db:/var/www/db -v $PWD/nuget/packages:/var/www/packagefiles -e NUGET_API_KEY=ee28314c-f7fe-2550-bd77-e09eda3d0119 sunside/simple-nuget-server
這里環境變量NUGET_API_KEY要記住后面的命令需要使用
成功后如下圖所示:

使用cmd命令到項目文件夾下,執行 dotnet pack 命令:

下載Nuget.exe (下載地址https://dist.nuget.org/win-x86-commandline/v4.7.0/nuget.exe)
將Nuget.exe 放置 C:\Program Files\dotnet目錄下(一般安裝了netcoreSDK 一定有這個目錄)
cmd到項目Debug文件夾下,會看到生成的項目包,執行如下命令:
nuget push -Source http://47.99.92.76:8090/ -ApiKey ee28314c-f7fe-2550-bd77-e09eda3d0119 MI.Untity.1.0.0.nupkg (這里的ApiKey則是第一步的環境變量詳細參數查看https://docs.microsoft.com/zh-cn/nuget/tools/cli-ref-push)

項目里配置包地址,然后就可以使用了!
