Quantcast
Channel: ++C++; // 未確認飛行 C ブログ
Viewing all articles
Browse latest Browse all 483

packages.config から project.json への移行

$
0
0

昨日、勉強会で少し話しましたが、Visual Studio 2015で、csproj/vbproj 中での NuGet パッケージ管理が少し楽になります。

正確には、7/20にリリースされた状態の Visual Studio 2015だけじゃなくて、その後Windows 10に合わせて出たVisual Studio Tools for Windowsが必要。(どうも、その後Visual Studio 2015のバイナリも更新されていて、最新のやつならVisual Studio 2015に含まれているっぽい(もしかしたらCommunityだけかも?))。

移行ツール書きました。

既存のプロジェクトを新しい仕組みに対応させるには、現状だと何の移行ツールも提供されていなくて、自前で色々と作業が必要になります。

個人的に試してみた結果、機械作業で、プログラムを使って自動化できそうだったので、作ったのが以下の移行ツール。

https://github.com/ufcpp/UfcppSample/tree/master/Tools/MigrateToProjectJson

以下、移行ツールの readme からのコピペ。

project.json

元々は ASP.NET 5/.NET Core/.xproj 向けのプロジェクト管理情報が入った JSON ファイル。

NuGet v3 で、その project.json のサブセットを使って、.csproj/.vbproj でも NuGet パッケージ管理を project.json でやるようになった。

ただし、公式にサポートするのは以下の3つだけ。

  • ASP.NET 5
  • Modern PCL (プロジェクト テンプレートの「Class Library (package)」/「クラス ライブラリ (パッケージ)」で作るやつ)
  • Universal Windows Platform アプリ(以下、UWP)

前2つは元から .xproj 形式。UWP だけがこの新しい仕組み(.csproj + project.json)で動いてる。

.csproj + project.json

サポート外(自己責任利用)ではあるものの、任意のプロジェクトから project.json を使うことが可能。

例えば、これまでの NuGet パッケージ管理「packages.confing」で、Rx-Main を参照すると以下のようになってたはず。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Rx-Core" version="2.3.0-beta2" targetFramework="net46" />
  <package id="Rx-Interfaces" version="2.3.0-beta2" targetFramework="net46" />
  <package id="Rx-Linq" version="2.3.0-beta2" targetFramework="net46" />
  <package id="Rx-Main" version="2.3.0-beta2" targetFramework="net46" />
  <package id="Rx-PlatformServices" version="2.3.0-beta2" targetFramework="net46" />
</packages>

これを、project.json という名前で、以下のような JSON ファイルに置き替える。

{
  "frameworks": {
    "net46": {}
  },
  "runtimes": {
    "win": {},
    "win-anycpu": {}
  },
  "dependencies": {
    "Rx-Main": "2.3.0-beta2"
  }
}

手動でファイルの置き換えをした後、プロジェクトを読み込みなおす(ソリューションを閉じて開きなおすとかでも OK)と、NuGet v3 でパッケージ管理される状態になる。

NuGet v3 で新しくなったこと

NuGet v3 で、.NET Core/.xproj (2015/7/20 の Visual Studio 2015 リリース時点でベータ状態)の一部分を前倒しで先に使えるようになった状態。

依存関係を自動で解決

project.json では、直接依存しているものだけを書けばよくなった。

上記の例の packages.config (NuGet v2)では、Rx-Main を参照するだけで、それが依存している Rx-Core, Rx-Interfaces, Rx-Linq, Rx-PlatformServices が一緒に追加される。 一方、project.json (NuGet v3)では、直接参照している Rx-Main の1行だけになった。

アップグレードやアンインストールの作業がだいぶ楽になるはず。

.csproj/.vbproj を汚さなくなった

NuGet v2 では、packages.config にパッケージ情報が入るだけじゃなくて、.csproj 側にダウンロードしてきた DLL への参照情報が入ってた。 しかも hint path がソリューションを基準とした相対パスなので、1つのプロジェクトを複数のソリューションから参照するとビルドできなくなったりする。

NuGet v3 では、project.json だけで完結して、.csproj/.vbproj には何も書かなくなった。 1つのプロジェクトを複数のソリューションから参照しても平気に。 また、ソースコード バージョン管理での衝突の可能性も減った。

キャッシュがユーザー単位に

NuGet v2 では、NuGet サーバーから取ってきたパッケージは、ソリューション直下の packages フォルダーにキャッシュされてた。

一方、NuGet v3 では、ユーザー フォルダーの下に、.nuget/packages というフォルダーを作ってそこにキャッシュされる。 同じユーザーのすべてのソリューションでキャッシュが共有される。

まとめ

変更点

  • 依存関係を自動解決
  • .csproj/.vbproj を汚さない
  • キャッシュがユーザー単位

その結果得られる利点

  • アップグレード/アンインストール作業が楽
  • 1つのプロジェクトを複数のソリューションから参照しても平気
  • キャッシュ効率アップ

移行プログラム

packages.config から project.json に自動的に置き替えるプログラム書いてみた。

  • packages.config からパッケージ情報を読み取る
  • project.json を作る
  • .csproj から、パッケージのDLLを Reference タグで参照してるところを消す
  • .csproj の packages.config 行を project.json に書き替える

注意点

Visual Studio Tools for Windows が必須。

開発者センター ダウンロードページで、「Windows 開発者ツールが付属した Visual Studio 2015」のところからダウンロード。


Viewing all articles
Browse latest Browse all 483

Latest Images

Trending Articles



Latest Images