project.json 和 csproj 屬性之間的映射
作者 Nate McMaster
.NET Core 工具的開發過程中實施了一項重要的設計更改,即不再支持 project.json 文件,而是將 .NET Core 項目轉移到 MSBuild/csproj 格式。
本文介紹 project.json 中的設置如何以 MSBuild/csproj 格式表示,以便用戶可學習如何使用新格式,並了解將項目升級到最新版本的工具時由遷移工具做出的更改。
csproj 格式
新格式 *.csproj 是一種基於 XML 的格式。 以下示例演示使用 Microsoft.NET.Sdk
的 .NET Core 項目的根節點。 對於 Web 項目,所使用的 SDK 是 Microsoft.NET.Sdk.Web
<Project Sdk="Microsoft.NET.Sdk">
...
</Project>
常見頂級屬性
name
JSON{
"name": "MyProjectName"
}
不再支持。 在 csproj 中,這取決於項目文件名(由目錄名稱定義)。 例如 MyProjectName.csproj
。
默認情況下,項目文件名還指定 <AssemblyName>
和 <PackageId>
屬性的值。
<PropertyGroup>
<AssemblyName>MyProjectName</AssemblyName>
<PackageId>MyProjectName</PackageId>
</PropertyGroup>
如果 buildOptions\outputName
屬性是在 project.json 中定義的,<AssemblyName>
將具有不同於 <PackageId>
的其他值。 有關詳細信息,請參閱其他常用生成選項。
版本
JSON{
"version": "1.0.0-alpha-*"
}
使用 VersionPrefix
和 VersionSuffix
屬性:
<PropertyGroup>
<VersionPrefix>1.0.0</VersionPrefix>
<VersionSuffix>alpha</VersionSuffix>
</PropertyGroup>
還可以使用 Version
屬性,但這可能會在打包過程中替代版本設置:
<PropertyGroup>
<Version>1.0.0-alpha</Version>
</PropertyGroup>
其他常用根級別選項
JSON{
"authors": [ "Anne", "Bob" ],
"company": "Contoso",
"language": "en-US",
"title": "My library",
"description": "This is my library.\r\nAnd it‘s really great!",
"copyright": "Nugetizer 3000",
"userSecretsId": "xyz123"
}
XML
<PropertyGroup>
<Authors>Anne;Bob</Authors>
<Company>Contoso</Company>
<NeutralLanguage>en-US</NeutralLanguage>
<AssemblyTitle>My library</AssemblyTitle>
<Description>This is my library.
And it‘s really great!</Description>
<Copyright>Nugetizer 3000</Copyright>
<UserSecretsId>xyz123</UserSecretsId>
</PropertyGroup>
框架
一個目標框架
JSON{
"frameworks": {
"netcoreapp1.0": {}
}
}
XML
<PropertyGroup>
<TargetFramework>netcoreapp1.0</TargetFramework>
</PropertyGroup>
多個目標框架
JSON{
"frameworks": {
"netcoreapp1.0": {},
"net451": {}
}
}
使用 TargetFrameworks
屬性定義目標框架的列表。 使用分號來分隔多個框架值。
<PropertyGroup>
<TargetFrameworks>netcoreapp1.0;net451</TargetFrameworks>
</PropertyGroup>
依賴項
重要事項
如果依賴項是一個項目而不是包,則格式不同。 有關詳細信息,請參閱依賴項類型部分。
NETStandard.Library 元包
JSON{
"dependencies": {
"NETStandard.Library": "1.6.0"
}
}
XML
<PropertyGroup>
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
</PropertyGroup>
Microsoft.NETCore.App 元包
JSON{
"dependencies": {
"Microsoft.NETCore.App": "1.0.0"
}
}
XML
<PropertyGroup>
<RuntimeFrameworkVersion>1.0.3</RuntimeFrameworkVersion>
</PropertyGroup>
請註意,遷移項目中的 <RuntimeFrameworkVersion>
值由已安裝的 SDK 版本確定。
頂級依賴項
JSON{
"dependencies": {
"Microsoft.AspNetCore": "1.1.0"
}
}
XML
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.0" />
</ItemGroup>
依賴項(按框架)
JSON{
"framework": {
"net451": {
"dependencies": {
"System.Collections.Immutable": "1.3.1"
}
},
"netstandard1.5": {
"dependencies": {
"Newtonsoft.Json": "9.0.1"
}
}
}
}
XML
<ItemGroup Condition="‘$(TargetFramework)‘==‘net451‘">
<PackageReference Include="System.Collections.Immutable" Version="1.3.1" />
</ItemGroup>
<ItemGroup Condition="‘$(TargetFramework)‘==‘netstandard1.5‘">
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
</ItemGroup>
導入
JSON{
"dependencies": {
"YamlDotNet": "4.0.1-pre309"
},
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dnxcore50",
"dotnet"
]
}
}
}
XML
<PropertyGroup>
<PackageTargetFallback>dnxcore50;dotnet</PackageTargetFallback>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="YamlDotNet" Version="4.0.1-pre309" />
</ItemGroup>
依賴項類型
類型:項目
JSON{
"dependencies": {
"MyOtherProject": "1.0.0-*",
"AnotherProject": {
"type": "project"
}
}
}
XML
<ItemGroup>
<ProjectReference Include="..\MyOtherProject\MyOtherProject.csproj" />
<ProjectReference Include="..\AnotherProject\AnotherProject.csproj" />
</ItemGroup>
註意
這將打破 dotnet pack --version-suffix $suffix
確定項目引用的依賴項版本的方式。
類型:生成
JSON{
"dependencies": {
"Microsoft.EntityFrameworkCore.Design": {
"version": "1.1.0",
"type": "build"
}
}
}
XML
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.0" PrivateAssets="All" />
</ItemGroup>
類型:平臺
JSON{
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.1.0",
"type": "platform"
}
}
}
csproj 中沒有等效項。
runtimes
JSON{
"runtimes": {
"win7-x64": {},
"osx.10.11-x64": {},
"ubuntu.16.04-x64": {}
}
}
XML
<PropertyGroup>
<RuntimeIdentifiers>win7-x64;osx.10-11-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
</PropertyGroup>
獨立應用(獨立部署)
在 project.json 中,定義 runtimes
部分意味著應用在生成和發布期間獨立。 在 MSBuild 中,生成期間所有項目均可移植,但可發布為獨立。
dotnet publish --framework netcoreapp1.0 --runtime osx.10.11-x64
有關詳細信息,請參閱獨立部署 (SCD)。
工具
JSON{
"tools": {
"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-*"
}
}
XML
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
</ItemGroup>
註意
csproj 中不支持工具上的 imports
。 需要導入的工具無法用於新的 Microsoft.NET.Sdk
。
buildOptions
另請參閱文件。
emitEntryPoint
JSON{
"buildOptions": {
"emitEntryPoint": true
}
}
XML
<PropertyGroup>
<OutputType>Exe</OutputType>
</PropertyGroup>
如果 emitEntryPoint
為 false
,OutputType
的值會轉換為 Library
(這是默認值):
{
"buildOptions": {
"emitEntryPoint": false
}
}
XML
<PropertyGroup>
<OutputType>Library</OutputType>
<!-- or, omit altogether. It defaults to ‘Library‘ -->
</PropertyGroup>
keyFile
JSON{
"buildOptions": {
"keyFile": "MyKey.snk"
}
}
keyFile
元素在 MSBuild 中擴展為三個屬性:
<PropertyGroup>
<AssemblyOriginatorKeyFile>MyKey.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
<PublicSign Condition="‘$(OS)‘ != ‘Windows_NT‘">true</PublicSign>
</PropertyGroup>
其他常用生成選項
JSON{
"buildOptions": {
"warningsAsErrors": true,
"nowarn": ["CS0168", "CS0219"],
"xmlDoc": true,
"preserveCompilationContext": true,
"outputName": "Different.AssemblyName",
"debugType": "portable",
"allowUnsafe": true,
"define": ["TEST", "OTHERCONDITION"]
}
}
XML
<PropertyGroup>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<NoWarn>$(NoWarn);CS0168;CS0219</NoWarn>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PreserveCompilationContext>true</PreserveCompilationContext>
<AssemblyName>Different.AssemblyName</AssemblyName>
<DebugType>portable</DebugType>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants>$(DefineConstants);TEST;OTHERCONDITION</DefineConstants>
</PropertyGroup>
packOptions
另請參閱文件。
常用包選項
JSON{
"packOptions": {
"summary": "numl is a machine learning library intended to ease the use of using standard modeling techniques for both prediction and clustering.",
"tags": ["machine learning", "framework"],
"releaseNotes": "Version 0.9.12-beta",
"iconUrl": "http://numl.net/images/ico.png",
"projectUrl": "http://numl.net",
"licenseUrl": "https://raw.githubusercontent.com/sethjuarez/numl/master/LICENSE.md",
"requireLicenseAcceptance": false,
"repository": {
"type": "git",
"url": "https://raw.githubusercontent.com/sethjuarez/numl"
},
"owners": ["Seth Juarez"]
}
}
XML
<PropertyGroup>
<!-- summary is not migrated from project.json, but you can use the <Description> property for that if needed. -->
<PackageTags>machine learning;framework</PackageTags>
<PackageReleaseNotes>Version 0.9.12-beta</PackageReleaseNotes>
<PackageIconUrl>http://numl.net/images/ico.png</PackageIconUrl>
<PackageProjectUrl>http://numl.net</PackageProjectUrl>
<PackageLicenseUrl>https://raw.githubusercontent.com/sethjuarez/numl/master/LICENSE.md</PackageLicenseUrl>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://raw.githubusercontent.com/sethjuarez/numl</RepositoryUrl>
<!-- owners is not supported in MSBuild -->
</PropertyGroup>
MSBuild 中沒有 owners
元素的等效項。 對於 summary
,可使用 MSBuild <Description>
屬性 - 即使 summary
的值未自動遷移到該屬性,因為該屬性已映射到 description
元素。
腳本
JSON{
"scripts": {
"precompile": "generateCode.cmd",
"postpublish": [ "obfuscate.cmd", "removeTempFiles.cmd" ]
}
}
它們在 MSBuild 中的等效項是目標:
XML<Target Name="MyPreCompileTarget" BeforeTargets="Build">
<Exec Command="generateCode.cmd" />
</Target>
<Target Name="MyPostCompileTarget" AfterTargets="Publish">
<Exec Command="obfuscate.cmd" />
<Exec Command="removeTempFiles.cmd" />
</Target>
runtimeOptions
JSON{
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true,
"System.GC.Concurrent": true,
"System.GC.RetainVM": true,
"System.Threading.ThreadPool.MinThreads": 4,
"System.Threading.ThreadPool.MaxThreads": 25
}
}
}
此組中除“System.GC.Server”屬性以外的所有設置與遷移過程中提升為根對象的選項一並被置於項目文件夾中名為 runtimeconfig.template.json 的文件中:
JSON{
"configProperties": {
"System.GC.Concurrent": true,
"System.GC.RetainVM": true,
"System.Threading.ThreadPool.MinThreads": 4,
"System.Threading.ThreadPool.MaxThreads": 25
}
}
已將“System.GC.Server”屬性遷移到 csproj 文件:
XML<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
但可以在 csproj 以及 MSBuild 屬性中設置所有這些值:
XML<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
<RetainVMGarbageCollection>true</RetainVMGarbageCollection>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
<ThreadPoolMaxThreads>25</ThreadPoolMaxThreads>
</PropertyGroup>
共享
JSON{
"shared": "shared/**/*.cs"
}
在 csproj 中不支持。 而必須在 .nuspec 文件中創建要包含的內容文件。 有關詳細信息,請參閱包含內容文件。
文件
在 project.json 中,可將生成和打包操作擴展為從不同的文件夾進行編譯和嵌入。 在 MSBuild 中,使用項實現此操作。 以下示例是一個常見轉換:
JSON{
"buildOptions": {
"compile": {
"copyToOutput": "notes.txt",
"include": "../Shared/*.cs",
"exclude": "../Shared/Not/*.cs"
},
"embed": {
"include": "../Shared/*.resx"
}
},
"packOptions": {
"include": "Views/",
"mappings": {
"some/path/in/project.txt": "in/package.txt"
}
},
"publishOptions": {
"include": [
"files/",
"publishnotes.txt"
]
}
}
XML
<ItemGroup>
<Compile Include="..\Shared\*.cs" Exclude="..\Shared\Not\*.cs" />
<EmbeddedResource Include="..\Shared\*.resx" />
<Content Include="Views\**\*" PackagePath="%(Identity)" />
<None Include="some/path/in/project.txt" Pack="true" PackagePath="in/package.txt" />
<None Include="notes.txt" CopyToOutputDirectory="Always" />
<!-- CopyToOutputDirectory = { Always, PreserveNewest, Never } -->
<Content Include="files\**\*" CopyToPublishDirectory="PreserveNewest" />
<None Include="publishnotes.txt" CopyToPublishDirectory="Always" />
<!-- CopyToPublishDirectory = { Always, PreserveNewest, Never } -->
</ItemGroup>
註意
許多默認 glob 模式由 .NET Core SDK 自動添加。 有關更多信息,請參見默認編譯項值。
所有 MSBuild ItemGroup
元素都支持Include
、Exclude
和 Remove
。
可使用 PackagePath="path"
修改 .nupkg 內的包布局。
除 Content
外,大多數項組需要顯式添加要包括在包中的 Pack="true"
。 Content
將被置於包中的 content 文件夾,因為 <IncludeContentInPack>
屬性默認設置為 true
。 有關詳細信息,請參閱在包中包含內容。
PackagePath="%(Identity)"
是一種將包路徑設置為項目相對文件路徑的快捷方法。
testRunner
xUnit
JSON{
"testRunner": "xunit",
"dependencies": {
"dotnet-test-xunit": "<any>"
}
}
XML
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-*" />
<PackageReference Include="xunit" Version="2.2.0-*" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0-*" />
</ItemGroup>
MSTest
JSON{
"testRunner": "mstest",
"dependencies": {
"dotnet-test-mstest": "<any>"
}
}
XML
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-*" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.12-*" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.11-*" />
</ItemGroup>
原文地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/tools/project-json-to-csproj
project.json 和 csproj 屬性之間的映射