以前的項目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的項目文件,後來還是決定不使用這個格式。 VS2017 的項目格式更好讀、更簡單而且減少了 git 衝突。 本文來告訴大家如何從 VS2015 和以前的項目格式修改為 VS2017 項目... ...
以前的項目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的項目文件,後來還是決定不使用這個格式。 VS2017 的項目格式更好讀、更簡單而且減少了 git 衝突。
本文來告訴大家如何從 VS2015 和以前的項目格式修改為 VS2017 項目格式。
在遷移之前,我需要告訴大家,現在是2018年1月15日,最新的項目格式只有對下麵的項目支持
- class library projects 類庫項目
- console apps 控制項目
- ASP.NET Core web apps asp 項目
- .NET Core .NET Core
對於 UWP 和 WPF ,有 xaml 的項目是沒有很好支持,如果你的項目是 WPF 的,那麼請不要再往下看。
現在很多項目,測試項目都使用新格式,建議在測試項目試試
建議從一個測試項目試試,先做好提交,如果失敗可以回滾。
如果創建是庫項目,那麼 csproj 只有下麵的代碼
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
</Project>
如果創建的是控制項目,那麼只有下麵的代碼
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
</Project>
如果創建的是測試項目,那麼只有下麵的代碼
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
<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>
</Project>
如果想知道新格式和之前的區別,如何從以前的格式遷到新的格式,請看下麵
下麵從項目的第一行開始
原來的第一行是
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
新的格式的第一行是
<Project Sdk="Microsoft.NET.Sdk">
可以看到新的格式的代碼比較少
其實建議大家重新創建一個項目,然後把文件放進去,安裝 Nuget 不然需要修改比較多。
必須刪除
下麵的代碼必須刪除
<!-- usually at the top of the file -->
<!-- 下麵的代碼一般在文件的最前 -->
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<!-- usually at the bottom -->
<!-- 一般在文件的最後面 -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
必須修改
需要修改平臺的代碼
這是以前的代碼
<PropertyGroup>
<!-- ... -->
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
</PropertyGroup>
需要修改為下麵的代碼
<PropertyGroup>
<TargetFramework>net452</TargetFramework>
</PropertyGroup>
如果是 v4.5.2 ,請修改為 net452 ,如果是 v4.6 就修改為 net46
添加文件
現在新的格式可以使用通配添加文件,例如在文件夾的所有的代碼都需要添加,可以使用這個方式
<Compile Include="lindexi\*.cs" />
預設是下麵代碼
<!-- the defaults -->
<Compile Include="**\*.cs" />
<EmbeddedResource Include="**\*.resx" />
所以添加的 cs 文件都會添加到編譯,需要刪除這個代碼才可以不編譯一些文件
項目引用
之前的方式需要添加很多代碼,如引用 ClassLibrary1 的項目,需要寫下麵的代碼
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
<Project>{2C7DF870-5B35-49EF-963D-EE1E72C3177E}</Project>
<Name>ClassLibrary1</Name>
</ProjectReference>
Project 這個可以表示這是一個類庫或一個其他的項目,因為新的項目不需要這個,所以在新建文件的時候就不知道給哪個項目,這是比較差的
新的格式就需要下麵的代碼
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" />
如果引用的項目有依賴,以前的格式需要把引用寫在文件,現在不需要添加引用
假如有 A 引用 B ,B 引用 C ,那麼之前的A項目文件就是這樣
<ProjectReference Include="..\ProjectB\ProjectB.csproj">
<Project>{A900C843-8340-421B-B4F0-6C65A0D093C4}</Project>
<Name>ProjectB</Name>
</ProjectReference>
<ProjectReference Include="..\ProjectC\ProjectC.csproj">
<Project>{871AC142-FC46-49F5-A5E0-90436648B9C5}</Project>
<Name>ProjectB</Name>
</ProjectReference>
現在的文件格式不需要寫引用
<ProjectReference Include="..\ProjectB\ProjectB.csproj" />
引用包
之前的 Nuget 引用需要添加 packages.config 和 csproj 才可以使用,現在的 Nuget 4 可以直接在 csproj 添加引用
這是之前的格式
<Import Project="..\..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props')" />
<ItemGroup>
<None Include="packages.config" />
<Reference Include="MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
新的格式寫引用,不需要 packages.config 文件,這樣減少了找不到nuget的坑,下麵代碼就是新的格式,可以看到代碼減少1/2
<ItemGroup>
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
<PackageReference Include="MySql.Data" Version="6.9.9" />
</ItemGroup>
這個格式可以在git衝突比較容易看到哪裡需要修改,所以解決衝突很簡單
在 nuget 2 的引用,如果引用了包A,他引用了 B ,那麼就需要在 packages.config 引用寫了這幾個項目
<?xml version="1.0" encoding="utf-8"?>
<!-- in packages.config -->
<packages>
<package id="A" version="2.2.0" targetFramework="net452" />
<package id="B" version="2.0.1" targetFramework="net452" />
</packages>
現在 Nuget 4 需要寫引用的庫,不需要寫他的引用,所以可以減少代碼,添加了id和版本就好
<ItemGroup>
<PackageReference Include="A" Version="2.2.0" />
</ItemGroup>
如果在遷移過程遇到詭異的問題,請看將 WPF、UWP 以及其他各種類型的舊樣式的 csproj 文件遷移成新樣式的 csproj 文件 - walterlv
參見:Old csproj to new csproj: Visual Studio 2017 upgrade guide
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫。