.NET Core 編程指南中文版 —— 7.2 遷移 -> 從 project.json 遷移

從 project.json 遷移 .NET Core 項目

本文檔介紹 .NET Core 項目的遷移方案,並探討以下三個遷移方案:

  1. 從 project.json 的一個最新有效架構遷移到 csproj
  2. 從 DNX 遷移到 csproj
  3. 從 RC3 和以前的 .NET Core csproj 項目遷移到最終格式

本文檔僅適用於仍使用 project.json 的較舊的 .NET Core 項目。 它不適用於從 .NET Framework 遷移到 .NET Core。

從 project.json 遷移到 csproj

可使用以下任一方法從 project.json 遷移到 .csproj:

這兩種方法使用同一個基礎引擎來遷移項目,因此,二者結果相同。 在大多數情況下,只需使用這兩種方法中的一種將 project.json 遷移到 csproj,而無需進一步對項目文件執行手動編輯。 生成的 .csproj 文件的名稱與包含目錄名稱相同。

Visual Studio 2017

打開 .xproj 文件或打開引用 .xproj 文件的解決方案文件時,將顯示「單向升級」對話框。 該對話框將顯示要遷移的項目。 如果打開解決方案文件,則將列出解決方案文件中指定的所有項目。 查看要遷移的項目的列表,然後選擇「確定」。

單向升級對話框,其中顯示要遷移的項目的列表

Visual Studio 將遷移自動選擇的項目。 遷移解決方案時,如果不選擇所有項目,會顯示相同的對話框,要求升級該解決方案的其餘項目。 遷移項目後,可通過在「解決方案資源管理器」窗口中右鍵單擊該項目,並選擇「編輯 <項目名稱 > .csproj」來查看和修改其內容。

已遷移的文件(project.json、global.json、.xproj 和解決方案文件)會移動到備份文件夾。 遷移的解決方案文件會升級到 Visual Studio 2017,將無法在先前版本的 Visual Studio 中打開該解決方案文件。 還會保存並自動打開名爲 UpgradeLog.htm 的文件,該文件包含遷移報告。

 重要

新工具在 Visual Studio 2015 中不可用,因此無法使用該版本的 Visual Studio 遷移項目。

dotnet migrate

在該命令行方案中,可以使用 dotnet migrate 命令。 它會按順序遷移項目、解決方案或一組文件夾,具體取決於所找到的項。 遷移項目時,將遷移項目及其所有依賴項。

已遷移的文件(project.json、global.json 和 .xproj)會移動到備份文件夾。

 備註

如果使用的是 Visual Studio Code,dotnet migrate 命令不會修改 tasks.json 等 Visual Studio Code 專屬文件。 需要手動更改這些文件。 如果使用 Project Ryder 或 Visual Studio 以外的任何編輯器或集成開發環境 (IDE),也是如此。

請參閱 project.json 和 csproj 屬性之間的映射,瞭解 project.json 和 csproj 格式的比較情況。

常見問題

  • 如果看到錯誤消息:「找不到匹配命令 dotnet-migrate 的可執行文件」:

請運行 dotnet --version 查看所使用的版本。 dotnet migrate 需要 .NET Core CLI RC3 或更高版本。 如果當前目錄或父級目錄中有 global.json 文件,且 sdk 版本設置爲較低版本,則會收到此錯誤。

從 DNX 遷移到 csproj

如果仍在使用 DNX 進行 .NET Core 開發,則應分兩個階段完成遷移過程:

  1. 使用現有 DNX 遷移指南從 DNX 遷移到啓用了 project-json 的 CLI。
  2. 請按照上一部分中的步驟,從 project.json 遷移到 .csproj。

 備註

已於 .NET Core CLI 的預覽版 1 發佈期間正式棄用 DNX。

從較早的 .NET Core csproj 格式遷移到 RTM csproj

隨着工具的每個新的預發佈版本的推出,.NET Core csproj 格式也在不斷變化發展。 沒有工具可以將項目文件從早期版本的 csproj 遷移到最新版本,因此需要手動編輯項目文件。 實際步驟取決於要遷移的項目文件的版本。 根據版本之間的變化,需考慮以下指導信息:

  • 從 <Project> 元素中刪除工具版本屬性(如果存在)。
  • 從 <Project> 元素中刪除 XML 命名空間 (xmlns)。
  • 如果不存在,請將 Sdk 屬性添加到 <Project> 元素,並將其設置爲 Microsoft.NET.Sdk 或 Microsoft.NET.Sdk.Web。 此屬性指定項目使用要使用的 SDK。 Microsoft.NET.Sdk.Web 用於 Web 應用。
  • 從項目的頂部和底部刪除 <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" />和 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 語句。 SDK 隱含這些 import 語句,因此項目中不需要這些語句。
  • 如果項目中有含 Microsoft.NETCore.App 或 NETStandard.Library 的 <PackageReference>,應將其刪除。 SDK 隱含這些包引用。
  • 刪除 Microsoft.NET.Sdk <PackageReference> 元素(如果存在)。 SDK 引用來自 <Project> 元素上的 Sdk 屬性。
  • 刪除 SDK 隱含的 glob。 在項目中留下這些 glob 會引發生成錯誤,因爲編譯項會發生重複。

完成這些步驟後,項目應與 RTM .NET Core csproj 格式完全兼容。

有關從舊的 csproj 格式遷移到新的 csproj 格式之前和之後情況的示例,請參閱 .NET 博客上的 Updating Visual Studio 2017 RC – .NET Core Tooling improvements(更新 Visual Studio 2017 RC - .NET Core 工具改進)文章。

請參閱