日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

.NET Core系列 : 2 、project.json 这葫芦里卖的什么药

發(fā)布時(shí)間:2023/12/31 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core系列 : 2 、project.json 这葫芦里卖的什么药 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

.NET Core系列 : 1、.NET Core 環(huán)境搭建和命令行CLI入門 介紹了.NET Core環(huán)境,本文介紹.NET Core中最重要的一個(gè)配置文件project.json的相關(guān)內(nèi)容。們可以使用.NET Core 的dotnet 命令行接口(CLI)dotnet new命令創(chuàng)建一個(gè)應(yīng)用,也可以用Visual Studio 2015 update 3創(chuàng)建一個(gè)應(yīng)用,他們都有一個(gè)project.json ,它是項(xiàng)目的配置文件,類似之前的*.csrpoj文件。Project.json 是一個(gè)新的項(xiàng)目文件,它的功能大部分與 *.*PROJ 文件重疊。它可標(biāo)識(shí)項(xiàng)目引用、版本選項(xiàng)(如版本號(hào))等事項(xiàng),并可標(biāo)識(shí)要編譯的平臺(tái),例如,是 .NET Core 還是 .NET Framework。心細(xì)的你可能已經(jīng)發(fā)現(xiàn)了他們所創(chuàng)建出來(lái)的project.json 文件的內(nèi)容有很多都不一樣。我們下面就來(lái)看下這個(gè)文件的內(nèi)容,project.json 的官方文檔 https://docs.microsoft.com/en-us/dotnet/articles/core/tools/project-json 。

project.json

首先,從我們 通過(guò) Visual Studio 創(chuàng)建的項(xiàng)目 xproj? 的 project.json︰

?

{
? "version": "1.0.0-*",
? "buildOptions": {
??? "emitEntryPoint": true
? },

? "dependencies": {
??? "Microsoft.NETCore.App": {
????? "type": "platform",
????? "version": "1.0.0"
??? }
? },

? "frameworks": {
??? "netcoreapp1.0": {
????? "imports": "dnxcore50"
??? }
? }
}

?

dotnet new 命令創(chuàng)建項(xiàng)目的 project.json:

?

{
? "version": "1.0.0-*",
? "buildOptions": {
??? "debugType": "portable",
??? "emitEntryPoint": true
? },
? "dependencies": {},
? "frameworks": {
??? "netcoreapp1.0": {
????? "dependencies": {
??????? "Microsoft.NETCore.App": {
????????? "type": "platform",
????????? "version": "1.0.0"
??????? }
????? },
????? "imports": "dnxcore50"
??? }
? }
}

他們結(jié)構(gòu)上看是相似的,但是具體內(nèi)容上有很大的不同的地方,他們都有4個(gè)頂級(jí)的屬性:version, buildOptions, dependencies 和 framework。.NET Core 項(xiàng)目結(jié)構(gòu)中最重要的文件可能是 project.json。此文件旨在:

替換 NuGet 文件管理器 package.config 文件,它可標(biāo)識(shí)項(xiàng)目的 NuGet 引用。
指定項(xiàng)目支持的框架,以及有關(guān)如何為特定框架構(gòu)建項(xiàng)目的配置詳細(xì)信息。
標(biāo)識(shí)獨(dú)立應(yīng)用的目標(biāo)平臺(tái),它含有其所有依賴項(xiàng),包括對(duì)應(yīng)平臺(tái)所需的特定于平臺(tái)的 .NET Core 運(yùn)行時(shí)?;蛘?#xff0c;如果項(xiàng)目是可移植應(yīng)用,project.json 可標(biāo)識(shí)項(xiàng)目會(huì)在目標(biāo)計(jì)算機(jī)(將在其上運(yùn)行程序集)上安裝的框架。
這三個(gè)任務(wù)分布在 project.json 中的四個(gè)主要部分(根據(jù)項(xiàng)目類型,我將Frameworks 和 dependencies合并為功能重疊):

Version

version 這個(gè)屬性是你所要構(gòu)建的組件的最小的元數(shù)據(jù),其他元數(shù)據(jù)包括name,title,description ,copyright 等, name 選項(xiàng)默認(rèn)情況下使用的是父文件夾名稱,你可以通過(guò)name 這個(gè)屬性給它取個(gè)你想要的名字。

?

buildOptions

buildOptions節(jié)點(diǎn)定義了如何編譯和編譯哪些文件等,也就是編譯選項(xiàng)。編譯選項(xiàng)部分包含一些有用的屬性。首先是 emitEntryPoint,這用來(lái)確定是否生成可執(zhí)行二進(jìn)制文件或 exe 。默認(rèn)情況下,調(diào)用 Program.Main() 方法將被調(diào)用來(lái)運(yùn)行你的應(yīng)用。

我發(fā)現(xiàn)一個(gè)有趣的屬性是"debugType":"portable"。Visual Studio 代碼調(diào)試器必須設(shè)置這個(gè)屬性才能夠工作的。但這也意味著您的應(yīng)用程序?qū)⒁圆煌姆绞桨l(fā)布,具體哪個(gè)值取決于您在此處的設(shè)置。簡(jiǎn)要的可以看前一篇文章的dotnet publish 節(jié),更多的介紹在后面發(fā)布應(yīng)用程序的時(shí)候介紹。

Frameworks 和 dependencies

dependencies此部分列出了你的項(xiàng)目所依賴的各個(gè) NuGet 包,包括所述依賴項(xiàng)的版本號(hào)??梢允褂猛ㄅ浞付ò姹咎?hào),從而你可以允許 NuGet 包管理器還原自動(dòng)下載與通配符相匹配的“最新版本”。版本號(hào)的空引號(hào)對(duì)表示“使用最新可用項(xiàng)”。我們創(chuàng)建的項(xiàng)目可以針對(duì)一個(gè)或者多個(gè)Framework(比如我們希望創(chuàng)建的可以同時(shí)在.NET Framework和.NET Core上運(yùn)行),支持的Framework定義在frameworks節(jié)點(diǎn)下。如果添加了多個(gè)Framework,并不是說(shuō)最終生成的應(yīng)用可以同時(shí)在這 些Framework中運(yùn)行,而是說(shuō)源文件在編譯的時(shí)候會(huì)針對(duì)這些Framework生成對(duì)應(yīng)的程序集。對(duì)于傳統(tǒng)的.NET項(xiàng)目來(lái)說(shuō),如果我們需要調(diào)用某個(gè)API,需要添加所在程序集的引用。對(duì)于.NET Core來(lái)說(shuō),所有使用到的程序集都被打包成一個(gè)NuGet包,所以針對(duì)程序集的直接依賴轉(zhuǎn)變成針對(duì)某個(gè)NuGet包的依賴。針對(duì)NuGet的依賴主要有 兩種類型,一種是針對(duì)所有Framework的,它們會(huì)直接定義在dependencies節(jié)點(diǎn)下,另一種則是針對(duì)某個(gè)具體Framework的, 定義為當(dāng)前Framework節(jié)點(diǎn)下的dependencies子節(jié)點(diǎn)。對(duì)于獨(dú)立應(yīng)用,運(yùn)行時(shí)部分指定將支持的 OS,因此可指定要綁定到應(yīng)用程序的運(yùn)行時(shí)庫(kù)。

從上面2個(gè)project.json 文件可以看出Frameworks 和 dependencies 存在依賴關(guān)系。他們是可以嵌套的,在最高一級(jí)的依賴項(xiàng),將是所有的Frameworks所依賴的,也可以針對(duì)一個(gè)具體的Framework 構(gòu)建它的依賴關(guān)系,不同的Framework使用不同版本的依賴項(xiàng)??瓷厦娴睦?#xff0c;我們看到Visual Studio和dotnet CLI版本定義的是相同的結(jié)果,只是兩種不同的表達(dá)方式。

?

Microsoft.NETCore.App

我們來(lái)仔細(xì)看下 Microsoft.NETCore.App:

"Microsoft.NETCore.App": {"type": "platform","version": "1.0.0"} 這是一個(gè)依賴項(xiàng),平臺(tái)的依賴,它也是Nuget包,其中包含了一堆系統(tǒng)庫(kù)的NuGet程序包,包含.netcore的基礎(chǔ)運(yùn)行時(shí)和基礎(chǔ)類庫(kù)。 文章

Running .NET Core apps on multiple frameworks and What the Target Framework Monikers (TFMs) are about 詳細(xì)的介紹了具體的內(nèi)容。

?

netcoreapp1.0

我們?cè)賮?lái)仔細(xì)看下? netcoreapp1.0:

"frameworks": {"netcoreapp1.0": {"imports": "dnxcore50"}} 框架netcoreapp1.0 是個(gè)多目標(biāo)框架對(duì)象名字(TFM)值,除了有經(jīng)典的net45,net46,現(xiàn)在又有了一些新的像netcoreapp1.0,文章

Running .NET Core apps on multiple frameworks and What the Target Framework Monikers (TFMs) are about 有更詳細(xì)的說(shuō)明。

?

NETStandard.Library

上面我們創(chuàng)建的項(xiàng)目是個(gè)應(yīng)用程序,當(dāng)我們回到類庫(kù)的時(shí)候,在依賴項(xiàng)里會(huì)發(fā)現(xiàn)一個(gè)NETStandard.Library:

{
? "version": "1.0.0-*",
? "buildOptions": {
??? "debugType": "portable"
? },
? "dependencies": {},
? "frameworks": {
??? "netstandard1.6": {
????? "dependencies": {
??????? "NETStandard.Library": "1.6.0"
????? }
??? }
? }
}

這也是一個(gè)NuGet 程序包: https://www.nuget.org/packages/NETStandard.Library/,里面包含了多個(gè)目標(biāo)版本,類似于老的PCL方法,以后就使用NETStandard.Library替代了PCL,我們有了一個(gè)更加統(tǒng)一的版本控制策略。

本質(zhì)上來(lái)說(shuō),NETStandard.Library 是一個(gè)目標(biāo)最低支持基礎(chǔ)類庫(kù),這樣就可以更好的向前兼容性,在現(xiàn)有的平臺(tái)出現(xiàn)新的版本時(shí)(如.net core 1.1 甚至 2.0)而無(wú)需重新發(fā)布新的變化。具體參考?https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md ,目前最新的表格:

Target Platform NameAlias???????
.NET Platform Standardnetstandard1.01.11.21.31.41.51.6
.NET Corenetcoreapp1.0
.NET Frameworknet4.6.3
??4.6.2?
??4.6.1??
??4.6???
??4.5.2????
??4.5.1????
??4.5?????
Universal Windows Platformuap10.0??
Windowswin8.1????
??8.0?????
Windows Phonewpa8.1????
Windows Phone Silverlightwp8.1??????
??8.0??????
Mono/Xamarin Platforms?*
Mono?*???

如何理解這個(gè)表格

  • 如果一個(gè)類庫(kù)指定.NET平臺(tái)標(biāo)準(zhǔn)1.3版本,那么它僅能夠運(yùn)行在.NET Framework 4.6或更新的框架、Universal Windows Platform 10(UWP)、DNX Core 5.0和Mono/Xamarin這些平臺(tái)上。
  • 如果一個(gè)類庫(kù)指定.NET平臺(tái)標(biāo)準(zhǔn)1.3版本,那么它能夠引用(原文:consume)所有來(lái)自之前的.NET平臺(tái)標(biāo)準(zhǔn)的版本(1.2、1.1、1.0)。

?

關(guān)于project.json 的更多信息

.NET Core項(xiàng)目依賴全部使用NuGet,要求使用NuGet 3.0版本,默認(rèn)使用nuget.org 作為源。在安裝VS2015 Update3時(shí),.NET Core所需的官方依賴包都已經(jīng)安裝在了(默認(rèn)安裝)C:\Program Files (x86)\Microsoft SDKs\NuGetPackages目錄下,在nuget管理中也可以看到這是默認(rèn)的離線包目錄,我們需要什么樣的包只要把它復(fù)制到這個(gè)目錄,在nuget管理中的程序包源選擇離線的源即可。執(zhí)行dotnet restore命令后項(xiàng)目會(huì)根據(jù)project.json文件配置來(lái)恢復(fù)項(xiàng)目依賴包,同時(shí)就會(huì)生成新的project.json.lock文件。

?

project.json.lock?

Project.json.lock 存儲(chǔ)編譯所需文件的列表(通常為 NuGet 引用)。與 project.json 文件不同,它包括特定的包版本號(hào),可支持通配符。如果沒(méi)有 project.json.lock,將完整還原包。Project.json.lock 包括包圖片以及本地下載的其他與包相關(guān)的數(shù)據(jù)(已還原)。它的工作方式 和 npm以及 RubyGems非常相似,你可以把這個(gè)文件簽入版本庫(kù),也可以不簽入,但此文件不存在時(shí),將運(yùn)行 NuGet restore 還原以重新創(chuàng)建。此文件列為 Visual Studio 中 project.json 的子項(xiàng)。

?

HellodotnetCore.xproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
? <PropertyGroup>
??? <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
??? <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
? </PropertyGroup>

? <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
? <PropertyGroup Label="Globals">
??? <ProjectGuid>34ee435f-9fda-4fb2-b4fb-a3203939f0c5</ProjectGuid>
??? <RootNamespace>HellodotnetCore</RootNamespace>
??? <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
??? <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
??? <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
? </PropertyGroup>

? <PropertyGroup>
??? <SchemaVersion>2.0</SchemaVersion>
? </PropertyGroup>
? <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>

?

和以往的csproj 文件一樣,這個(gè)文件架起Visual Studio 和MSBuild溝通的橋梁。HellodotnetCore.xproj 定義構(gòu)建項(xiàng)目時(shí)將發(fā)生的事項(xiàng)。最新版本可導(dǎo)入 Microsoft.DotNet.targets,它定義了利用新 DotNet.exe 命令的構(gòu)建任務(wù)。與過(guò)去的 MSBuild proj 文件不同,xproj 文件非常小,因?yàn)榇蟛糠中畔⒁?#xff08;暫時(shí))移到 project.json。不過(guò)后續(xù)這個(gè)文件要被csproj 替代,也許就在不久的將來(lái)的Visual Studio 2016上面就變成了csproj。

?

global.json

global.json是一個(gè)有待探究的神奇配置文件,我最喜歡的一個(gè)功能是全新的支持調(diào)試和單步執(zhí)行,甚至可以實(shí)時(shí)修改包的源代碼。假設(shè)你有公司范圍的“框架”程序集,可以在眾多團(tuán)隊(duì)之間共享。但是,

但是,框架包實(shí)際上是開(kāi)源的,因此公司內(nèi)(或者,甚至更好,公司外部)的任何人員均可進(jìn)行完善和更改?,F(xiàn)在,想像你如果為此框架引用 NuGet 包,但有時(shí)懷疑可能存在需要修復(fù)的缺陷或可能存在一個(gè)批準(zhǔn)的增強(qiáng)功能。通常,這需要獨(dú)立于項(xiàng)目/解決方案處理組件中的源代碼。相反,如果你能夠下載源代碼并隨時(shí)開(kāi)發(fā)將其更新為集成式體驗(yàn) - 甚至單步調(diào)試,而不依賴于符號(hào)服務(wù)器或 PDB 文件是否可用,會(huì)怎么樣? 幸運(yùn)地是,Visual Studio 2015 支持此關(guān)鍵場(chǎng)景。

例如,想象你想要調(diào)試 GitHub 上可用的 Microsoft.Extensions.Logging 包。要在項(xiàng)目中對(duì)其進(jìn)行添加和調(diào)試,你需要下載(可能使用 git clone 或 git submodule 命令)源代碼。接下來(lái),為了使 Visual Studio 知曉在何處查找源代碼,你需要編輯 global.json 項(xiàng)目節(jié)點(diǎn),如將“submodules\Logging”添加到查看的目錄列表:

{
? "projects": [ "src", "test", "submodules\Logging" ],
? "sdk": {
??? "version": "1.0.0-*"
? }
}
當(dāng)然,你可以提供完整路徑(例如,你未將代碼克隆到子目錄)。但是,請(qǐng)注意,目錄分隔符是兩個(gè)反斜杠 (\\) 或單個(gè)正斜線(如 c:/users/geffzhang/documents/visual studio2015/Projects/Microsoft.Extensions.Logging)。

更新并保存 global.json 后,一旦 Visual Studio 成功找到源代碼,它會(huì)自動(dòng)將項(xiàng)目添加到你的解決方案,使你可以調(diào)試到源代碼。

這里使用了一種非常棒的算法來(lái)確定要加載的源代碼目錄:

  • 如果 global.json 中指定的任何源代碼位置包含的文件夾具有與包相同的名稱(如 Microsoft.Extensions.Logging),且此文件夾包含名為 project.json 的文件,調(diào)試程序?qū)⑹褂么宋募A及其內(nèi)部的源文件。
  • 否則,會(huì)加載包文件夾中編譯的二進(jìn)制程序。
  • ?

    ?

    本文簡(jiǎn)要介紹了.NET Core項(xiàng)目中最為重要的一個(gè)配置文件project.json的內(nèi)容和相關(guān)的工具,類庫(kù)等基礎(chǔ)信息,下篇文章我們來(lái)聊聊如何構(gòu)建多個(gè)Project的解決方案的內(nèi)容。

    總結(jié)

    以上是生活随笔為你收集整理的.NET Core系列 : 2 、project.json 这葫芦里卖的什么药的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。