作為上床后需要下床檢查好幾次門關了沒有的資深強迫症患者,有一個及其搞我的問題,就是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無效。