VS上使用Nuget部分分析
VS上使用Nuget部分分析
介紹VS專案是如何使用Nuget的,如何還原包,如何處理包與專案之間的關係,如何複製Nuget包裡面檔案到專案
如何特殊說明,預設說的是 . Net Core專案,以及VS2017
Nuget包還原過程
-
各位同學可能都注意到第一次還原專案之後,專案多了個obj資料夾,裡面多了一些檔案,
專案名+".nuget.*"
,另外還有個project.assets.json
檔案,Nuget就是利用這個檔案開始工作,利用此檔案執行了ResolveNuGetPackageAssets
任務 -
首先看這個檔案
C:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuildMicrosoftNuGet15.0Microsoft.NuGet.targets
,現在解析一下這個檔案幹了什麼事情 -
1.使用匯入任務,也就是匯入dll裡面的任務
-
2.根據以下順序標識專案的asset/lock檔案,即給
$(ProjectLockFile)
賦值,如果以下條件均不滿足,NuGet build targets就不會執行:-
$(ProjectAssetsFile)
如果已經宣告,則給$(ProjectLockFile)
賦值,這意味著專案使用 [PackageReference] ( ect-files) -
如果
$(RestoreProjectStyle)
等於PackageReference
(也就是專案使用的包管理格式為 [PackageReference] ( ect-files)),賦值$(BaseIntermediateOutputPath)project.assets.json
-
如果存在
project.json
檔案,則使用project.lock.json
-
如果上述條件均不滿足,
assets or lock file
都不存在,預設賦值$(BaseIntermediateOutputPath)project.assets.json
-
-
3.新增MSBuildAllProjects以更好的支援增量構建
-
4.檢查執行時識別符號,如果沒有明確宣告,設定為
win;win-x86;win-x64
-
5.設定依賴targets,寫入
ResolveNuGetPackageAssetsDependsOn
,其中有個依賴target是ResolveProjectReferences
,用來載入當前所依賴專案的 -
6.執行Task
ResolveNuGetPackageAssets
,又分是否是AOT專案,主要輸出了- @(Analyzer) - Paths to build-time diagnostic analyzers 構建時診斷分析路徑
- @(Reference) - Paths to build-time NuGet dependencies 構建時NuGet依賴關係路徑
- @(ReferenceCopyLocalPaths) - Paths to run-time dependencies to copy 複製到執行時依賴關係的路徑
-
7.執行完之後,將框架注入到混合應用,猜測是將結果注入到全域性變數
-
8.最後會匯入
$(MSBuildProjectDirectory)$(MSBuildProjectName).nuget.targets
,$(MSBuildProjectDirectory)
是專案路徑,$(MSBuildProjectName)
是專案名稱,估計是用來啟用自定義任務的,比如專案叫做MyProj
,在專案新建MyProj.nuget.targets
檔案,Nuget Build之後會呼叫該target
猜測
- 以上是對
Microsoft.NuGet.targets
的內容分析,主要是根據asset/lock檔案
進行Nuget 的 還原過程,每個Nuget包可能也含有target,需要解析,匯入到專案執行。或者內容檔案需要複製到專案,這一切的基礎就是Microsoft.NuGet.targets
。 - 透過檔案內容搜尋,
Microsoft.NuGet.targets
是由C:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild15.0Microsoft.Common.TargetsImportAfterMicrosoft.NuGet.ImportAfter.targets
匯入的,這個檔案只是匯入Microsoft.NuGet.targets
而已。而該target應該有某種機制觸發的,並沒有找到在哪裡呼叫
總結
-
透過對這些檔案的分析,再結合官方文件,一來可以瞭解VS專案從點選生成專案到出現編譯好的dll中間都發生了什麼事,二來我們可以參照這些例子,寫一些自己的target,比如測試或者釋出,每次build專案,觸發測試的target或者釋出的target。
-
發現兩個比較有趣的東西如下:
-
Microsoft.NuGet.targets
中<FrameworkInjectionPackagesDirectory Condition="'$(FrameworkInjectionPackagesDirectory)' == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINESOFTWARENuGetRepository', 'NetCoreSDK', null, RegistryView.Registry32, RegistryView.Default))</FrameworkInjectionPackagesDirectory>
,可以看到HKEY_LOCAL_MACHINE
,訪問了登錄檔 - target中的task可以直接寫程式碼,匯入
Microsoft.Build.Tasks.v4.0.dll
裡面的Task,Reference
、Using
、Code
組合就可以直接寫程式碼啦。一下內容寫到Build.props
,然後再專案檔案匯入,放在Project
元素之下<Project><Import Project="Build.props" Condition="Exists('Build.props')" /></Project>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name = "BuildModelTarget" BeforeTargets="PrepareForBuild"> <BuildModel1 /> </Target> <UsingTask TaskName="BuildModel1" TaskFactory="CodeTaskFactory" AssemblyFile="$ (MSBuildToolsPath)Microsoft.Build.Tasks.v4.0.dll"> <Task > <Reference Include="System" /> <Reference Include="System.Management" /> <Using Namespace="System" /> <Using Namespace="System.Linq" /> <Using Namespace="System.Diagnostics" /> <Using Namespace="System.Management" /> <Code Type="Fragment" Language="cs"> <![CDATA[ throw new Exception("23333"); ]]> </Code> </Task> </UsingTask> </Project>
-
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2819149/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 將nuget與VS直接整合,實現一鍵上傳等功能
- 使用 Cake 推送 NuGet 包到 AzureDevops 的 Artifacts 上dev
- 分析nuget原始碼,用nuget + nuget.server實現winform程式的自動更新原始碼ServerORM
- 修改VS中的NuGet包下載路徑
- VS2022 修改nuget包位置
- vscode部分外掛的使用方法VSCode
- NuGet是什麼?為什麼.NET專案中會有NuGet?如何使用NuGet程式包?
- 10分鐘學會VS NuGet包私有化部署
- 使用 nuget server 的 API 來實現搜尋安裝 nuget 包ServerAPI
- 使用 baget 搭建 nuget 私有服務
- 【不費腦筋系列】釋出個人的程式碼包到Nuget伺服器上,並通過VS引用進行使用的方法伺服器
- vs2010 利用NuGet來安裝EFCodeFirst
- C#Nuget包製作、生成與上傳C#
- 使用dotnet Cli向nuget釋出包
- .net 知新:【4】NuGet簡介和使用
- 【轉】使用 NuGet 管理專案庫-Phil Haack
- 學習Source Generators之打包成Nuget使用
- 使用VS Code開發asp.net core (上)ASP.NET
- 使用 NuGet 下載最新的 Rafy 框架及文件框架
- CCTF部分賽題分析
- cuttag分析流程(部分存疑)
- nuget包管理:製作、釋出包到nuget伺服器、從nuget伺服器刪除包伺服器
- 手動搭建自己的nuget伺服器及使用伺服器
- 在Centos 7上使用Devstack快速安裝Openstack薦CentOSdev
- NuGet.Tools.dl
- 搞懂:資料科學vs.機器學習vs.資料分析vs.商業分析資料科學機器學習
- 如何分析付費使用者,第一部分—RFM分析
- ThreadLocal部分原始碼分析thread原始碼
- 01- Dify部分介面分析
- VS Code 的launch.json和tasks.json 簡介,移除某個 `nuget` 包JSON
- vsftpd匿名使用者上傳和下載的配置FTP
- 部署伺服器上線部分伺服器
- 建立NuGet本地包源
- nuget packages batch installPackageBAT
- GitLab 管理 NuGet 包Gitlab
- nuget離線安裝
- DPTP實驗部分原始碼分析原始碼
- nuget打包檔案丟失如何使用powershell指令碼解決指令碼