.NET Coreでマルチプロジェクト構成のソリューションを作る

.NET Coreに限らないお話ですが・・・本ブログ 及び 各所の技術解説では単一プロジェクト構成が取られることが多いです。
これは「対象解説において”スポットを当てる技術”以外の箇所の複雑さを省く」為です。

しかし、実際のシステム開発においては、「単一プロジェクト構成」ではなく「複数プロジェクト構成」が取られることがほとんどです。
例えば、レイヤー化アーキテクチャによる分離により、「Webモジュール(DLL)」「ドメインモジュール(DLL)」「Repositoryモジュール(DLL)」のようにモジュール分割を行います。この場合の”各モジュール”が、実装ソースレベルでは”各プロジェクト”になります。

本投稿では.NET Coreにおいてマルチプロジェクト構成を実現する方法について説明します。

環境

さて、本投稿の検証環境は以下の通りです。

dotnet --info

f:id:daigo-knowlbo:20161109013805p:plain

OSは Mac(OSx) 、.NET Core SDKは 1.0.0-preview2-1-003155 となります。

ソリューション・プロジェクトの構成

以下のソリューション・プロジェクトの構成を前提とします。

./MultiProjSol  
    --MyLib   ※ライブラリプロジェクト  
    --Myonsole  ※コンソールアプリケーションプロジェクト(MyLib内の実装クラスを参照利用する)  

つまり「MyConsole と MyLib」の2つのプロジェクトから構成されるソリューションです。
MyConsole は MyLib内の実装を参照(利用)します。

ソリューションディレクトリの作成

本投稿では、以下のディレクトリをソリューションディレクトリとします。

/Users/daigo/projects/MultiProjSol

MyLibプロジェクトの作成

MyLibディレクトリを作成し、dotnet new -t lib コマンドでライブラリプロジェクトを作成します。

cd /Users/daigo/projects/MultiProjSol
mkdir MyLib
cd MyLib
dotnet new -t lib

上記コマンド実行後のMyLibディレクトリの内容は以下の通りです。

ls -l
total 16
-rwxr--r--  1 daigo  staff  135 10  6 13:55 Library.cs
-rwxr--r--  1 daigo  staff  244 10 14 09:48 project.json

自動生成された Library.cs を以下のように修正します。

using System;

namespace MyLib
{
    public class EchoMania
    {
        public string Accost(string message)
        {    
            return "I'm 'Echo Mania'! Your message is '" + message + "'";
        }
    }
}

MyLib名前空間にEchoManiaクラスを実装しました。
Accostメソッドは、引数で渡されたmessageをエコーバックします。

MyConsoleプロジェクトの作成

MyConsoleディレクトリを作成し、dotnet new コマンドでコンソールアプリケーションプロジェクトを作成します。

cd /Users/daigo/projects/MultiProjSol
mkdir MyConsole
cd MyConsole
dotnet new

上記コマンド実行後の MyConsoleディレクトリ の内容は以下の通りです。

ls -l
total 16
-rwxr--r--  1 daigo  staff  202 10  6 13:55 Program.cs
-rwxr--r--  1 daigo  staff  367 10 14 09:48 project.json

Program.csを以下のように修正します。

using System;
using MyLib;

namespace MyConsole
{
    public class Program
    {
        public static void Main(string[] args)
        {
            EchoMania mania = new EchoMania();
            Console.WriteLine(mania.Accost("Hello World!"));
        }
    }
}

MyLib名前空間のEchoManiaをインスタンス化し、Accost()メソッドを呼び出します。
Accost()メソッドの戻り値の値をコンソールに出力します。

また、MyLibを利用する為に「project.json」の依存関係設定「dependencies」に対して追記を行います。
修正後の project.json は以下の通りです。

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {
    "MyLib": "*"
  },
  "frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.1.0-preview1-001100-00"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

global.jsonを作成

「global.jsonファイルの作成」が、マルチプロジェクトを実現する為のキーポイントになります。
ソリューションのルートディレクトリ、つまり本サンプルでは「/Users/daigo/projects/MultiProjSol」に「global.json」ファイルを作成します。
global.json内の「projectsキー」にソリューションを構成する各プロジェクトパスを記述します。
以下が global.json になります。

{
    "projects":[
        "MyConsole",
        "MyLib"
    ]
}

dotnet restoreを実行

ソリューションディレクトリ(global.jsonの保存ディレクトリ)において、 dotnet restore を実行します。

dotnet restore

パッケージのリストアが行われます。

f:id:daigo-knowlbo:20161109020602p:plain

実行

ではスタートアッププロジェクトである「MyConsoleディレクトリ」に移動し、 dotnet run を実行します。

dotnet run

f:id:daigo-knowlbo:20161109024112p:plain

MyLibプロジェクトに実装した EchoManiaクラス を利用する MyConsoleアプリケーションがうまく動作しました!

本投稿では利用していませんが、Visual Studio Codeを組み合わせて利用する事で、実践的な .NET Core アプリケーションの実装は十分に可能となります。