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

XML 复制

<Project Sdk="Microsoft.NET.Sdk">
...
</Project>

常见顶级属性

name

JSON 复制

{
  "name": "MyProjectName"
}

不再支持。 在 csproj 中,这取决于项目文件名(由目录名称定义)。 例如 MyProjectName.csproj

默认情况下,项目文件名还指定 <AssemblyName> 和 <PackageId> 属性的值。

XML 复制

<PropertyGroup>
  <AssemblyName>MyProjectName</AssemblyName>
  <PackageId>MyProjectName</PackageId>
</PropertyGroup>

如果 buildOptions\outputName 属性是在 project.json 中定义的,<AssemblyName> 将具有不同于 <PackageId> 的其他值。 有关详细信息,请参阅其他常用生成选项

版本

JSON 复制

{
  "version": "1.0.0-alpha-*"
}

使用 VersionPrefix 和 VersionSuffix 属性:

XML 复制

<PropertyGroup>
  <VersionPrefix>1.0.0</VersionPrefix>
  <VersionSuffix>alpha</VersionSuffix>
</PropertyGroup>

还可以使用 Version 属性,但这可能会在打包过程中替代版本设置:

XML 复制

<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 属性定义目标框架的列表。 使用分号来分隔多个框架值。

XML 复制

<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 为 falseOutputType 的值会转换为 Library(这是默认值):

JSON 复制

{
  "buildOptions": {
    "emitEntryPoint": false
  }
}

XML 复制

<PropertyGroup>
  <OutputType>Library</OutputType>
  <!-- or, omit altogether. It defaults to ‘Library‘ -->
</PropertyGroup>

keyFile

JSON 复制

{
  "buildOptions": {
    "keyFile": "MyKey.snk"
  }
}

keyFile 元素在 MSBuild 中扩展为三个属性:

XML 复制

<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 元素都支持IncludeExclude 和 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

时间: 2024-08-24 10:11:53

project.json 和 csproj 属性之间的映射的相关文章

难以接受你的改变:从project.json到.csproj

自从微软做了一个艰难的决定——.NET Core彻底放弃project.json,全面改回.csproj——至今,虽然赞美之声不断,但我依然不喜欢也难以接受这样的改变. 难以接受主要有两方面的原因: 1)由繁入简易,由简入繁难 习惯了json格式的简洁,很难再适应xml格式的繁琐.无论微软怎么简化.csproj,与project.json天生的简洁相比也是望尘莫及.简单对比一下,立马就能体会到. <Project Sdk="Microsoft.NET.Sdk" ToolsVers

.NET Core项目从xproj+project.json向csproj迁移简介

3月7日,微软发布了Visual Studio 2017 RTM,与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0,尽管这些并不是最新版,但也已经从preview版本升级到了正式版.所以,在安装Visual Studio 2017时如果启用了.NET Core开发的相关功能,那么在安装完成后,你可以在命令行直接执行dotnet.exe,此时你可以看到.NET Core版本是1.1.0,而如果是执行dotnet.exe --version命

.NET Core项目修改project.json来引用其他目录下的源码等文件的办法 &amp; 解决多框架时 project.json 与 app.config冲突的问题

作者: zyl910 一.缘由 项目规模大了后,经常会出现源码文件分布在不同目录的情况,但.NET Core项目默认只有项目目录下的源码文件,且不支持“Add As Link”方式引入文件.这时需要手工修改project.json文件了. 可能是因为最新版本已将 project.json 转为 .csproj,导致我花了一些功夫才找到配置办法,故写了这篇笔记. 二.引用其他目录下的源码等文件的办法 2.1 官网说明 官网的 project.json 和 csproj 属性之间的映射 里简单介绍了

[.NET Core 24]把project.json迁移到.csproj

链接:https://blog.jetbrains.com/dotnet/2017/04/04/rider-eap-update-csproj-based-net-core-support-migrate/ how to migrate from the (deprecated) project.json format to the new .csproj format. First, Microsoft greatly simplified the .csprojformat. In mini

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

.NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可以使用.NET Core 的dotnet 命令行接口(CLI)dotnet new命令创建一个应用,也可以用Visual Studio 2015 update 3创建一个应用,他们都有一个project.json ,它是项目的配置文件,类似之前的*.csrpoj文件.Project.json 是一个

[asp.net core]project.json(2)

摘要 上篇文章介绍了project.json中的一部分属性.属性真的比较多,所以分开了,考虑到其中的英文比较简单,也不再进行翻译了,从英文原文中,直接粘贴过来了. project.json(1) project.json publicSign Type: Boolean true to enable signing of the resulting assembly; otherwise, false. The default is false. For example: { "buildOpt

ABP文档 - 对象与对象之间的映射

文档目录 本节内容: 简介 IObjectMapper 接口 集成 AutoMapper 安装 创建映射 自动映射的特性 自定义映射 扩展方法 MapTo 单元测试 预定义的映射 LocalizableString -> string 注入 IMapper 简介 把一个对象映射到另一个相似的对象很常见,两个对象(类)具有相似或相同的属性,它们之间要互相映射,其实这项工作重复且无聊,考虑一个典型的应用服务方法,如下: public class UserAppService : Applicatio

SpringMVC使用注解完成 URL 和 Controller &amp; 方法之间的映射细节

1. 使用 @RequestMapping 来进行 URL 和 类 及 方法之间的映射. 2. @RequestMapping 注解可以标识到类上面,也可以标识到方法上 1). 若类上面没有标识,则方法上面的直接相对于 WEB 应用的根目录 < a href ="helloworld?name=springMVC">Hello SpringMVC </a> 2). 若类上面有 @RequestMapping 标识,则类上面的 @RequestMapping 的

一步一步学EF系列【2、Fluent API的方式来处理实体与数据表之间的映射关系。】

EF里面的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面,还有一个就是Fluent API,通过新增相应的配置类来覆盖默认配置另外.我们主要学习Fluent API,Data Annotations可以自行去学习一下. 补充一下为什么要用Fluent API 使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入Ent