做爲上牀後須要下牀檢查好幾回門關了沒有的資深強迫症患者,有一個及其搞個人問題,就是dll問題。html
曾幾什麼時候,在沒有nuget的年代,當有依賴項須要引用的時候,只能經過文件引用來管理引用問題,版本問題,更新問題層出不窮,非常難受。git
後來出來nuget,喜大普奔,總算解決了引用的問題。開心之餘,依然還有一個很膈應人的問題:生成文件夾滿地的dll,找個exe眼睛很難受。github
講道理這個也不是什麼大問題,可是就是心癢癢,就特別想把這些dll收到一個單獨文件夾裏面,外面就留exe和配置等文件。而後就找這個東西:PrettyBin。shell
PrettyBin
PrettyBin是一個開源的nuget包:https://github.com/slmjy/PrettyBin,使用它能夠將.NET Framework程序引用的文件收到lib文件夾裏面,使用起來也很是方便,老樣子,直接nuget安裝。markdown
Install-Package PrettyBin
提示從新加載項目,點擊肯定,就完事了。
安裝以前,輸出是這樣的:
app
安裝以後,輸出是這樣的:
post
dll之類的文件都進lib文件夾了,感受世界都乾淨了不少。visual-studio
補充
-
細心的童鞋應該可以發現,我寫的是.NET Framework的程序引用,.NET Core,.NET Standard呢?
答案是:.NET Core啥的東西生成的就是dll,都同樣就不必了。ui -
安裝prettybin以後,再安裝新的包會怎麼樣?受不受影響?
依然有用,不受影響。spa -
對於新的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無效。