作為上床後需要下床檢查好幾次門關了沒有的資深強迫症患者,有一個及其搞我的問題,就是dll問題。 曾幾何時,在沒有nuget的年代,當有依賴項需要引用的時候,只能通過文件引用來管理引用問題,版本問題,更新問題層出不窮,很是難受。 後來出來nuget,喜大普奔,總算解決了引用的問題。開心之餘,依然還有一 ...
作為上床後需要下床檢查好幾次門關了沒有的資深強迫症患者,有一個及其搞我的問題,就是dll問題。
曾幾何時,在沒有nuget的年代,當有依賴項需要引用的時候,只能通過文件引用來管理引用問題,版本問題,更新問題層出不窮,很是難受。
後來出來nuget,喜大普奔,總算解決了引用的問題。開心之餘,依然還有一個很膈應人的問題:生成文件夾滿地的dll,找個exe眼睛很難受。
講道理這個也不是什麼大問題,但是就是心癢癢,就特別想把這些dll收到一個單獨文件夾裡面,外面就留exe和配置等文件。然後就找這個東西:PrettyBin。
PrettyBin
PrettyBin是一個開源的nuget包:https://github.com/slmjy/PrettyBin,使用它可以將.NET Framework程式引用的文件收到lib文件夾裡面,使用起來也非常方便,老樣子,直接nuget安裝。
Install-Package PrettyBin
提示重新載入項目,點擊確定,就完事了。
安裝之前,輸出是這樣的:
安裝之後,輸出是這樣的:
dll之類的文件都進lib文件夾了,感覺世界都乾凈了很多。
補充
細心的童鞋應該能夠發現,我寫的是.NET Framework的程式引用,.NET Core,.NET Standard呢?
答案是:.NET Core啥的東西生成的就是dll,都一樣就沒必要了。安裝prettybin之後,再安裝新的包會怎麼樣?受不受影響?
依然有用,不受影響。對於新的nuget管理形式PackageReference效果如何怎麼樣?
這個有說法的,需要先瞭解這個包工作的原理。
原理解析
首先看看安裝的時候,nuget包管理器彈出的提示:
正在執行腳本文件“ConsoleApp4\packages\PrettyBin.1.1.0\tools\init.ps1”
Init BinPrettify
正在執行腳本文件“ConsoleApp4\packages\PrettyBin.1.1.0\tools\install.ps1”
Install PrettifyBin;
http://schemas.microsoft.com/developer/msbuild/2003
No Target AfterBuild Node. Creating
No ItemGroup whith MoveToLibFolder tag. Creating
No Move tag in AfterBuild Target. Creating
Edititing App.config
runtimeNode items
No probing Node. Creating
已將“PrettyBin 1.1.0”成功安裝到 ConsoleApp4
可以看到,這裡首先執行的是給項目文件添加`msbuild
內容,增加了AfterBuild
節點,MoveToLibFolder
節點和Move
節點。
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
<ItemGroup>
<MoveToLibFolder Include="$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml" />
</ItemGroup>
<Move SourceFiles="@(MoveToLibFolder)" DestinationFolder="$(OutputPath)lib" OverwriteReadOnlyFiles="true" />
</Target>
msbuild可以設置生成後的操作,成功生成之後,將目錄下麵的dll文件,pdb文件和xml都轉到了lib文件夾。
然後修改了app.config文件,在runtime底下增加了一個probing
節點。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="lib;libs" xmlns="" />
</assemblyBinding>
</runtime>
probing節點提供.NET程式集查找的選項,privatepath指定路徑,詳細資料可以查看MSDN:https://support.microsoft.com/en-us/help/837908/how-to-load-an-assembly-at-runtime-that-is-located-in-a-folder-that-is
補充資料:關於指定程式集位置
所以,prettybin是通過運行powershell
腳本設置生成成功後轉移文件,並將程式集查找路徑調整為lib文件夾。
根據https://docs.microsoft.com/zh-cn/nuget/reference/migrate-packages-config-to-package-reference,PackageReference方式nuget是不支持install.ps1腳本的。所以並不能支持prettybin。
新建.NET Framework程式是預設是通過傳統的package.config文件進行包管理的,新建.NET Core和.NET Standard都是預設使用PackageReference包管理。
結論
- 如果需要使用PrettyBin,那麼直接預設配置.NET FRAMEWORK項目的nuget管理方式,完美支持。
- 如果需要升級新的包管理方式,可以在安裝了PrettyBin之後升級項目,依然支持。
- 升級了PackageReference之後,安裝PrettyBin無效。