しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Core MVC アプリケーションでスキャフォールディングが使えない時は

サンプルではなく、実際に ASP.NET Core MVC アプリケーションを開発する人が選ぶと思われる認証なしテンプレートでは、Visual Studio でのスキャフォールディングに必要なパッケージが追加されません。

私は基本的に認証なしを選んで作っていくタイプなので、完全にはまりました。

f:id:shiba-yan:20160928000912p:plain

スキャフォールディングが使えないと、ビューを作るのが本当に大変なので辛いです。

実際に認証なしを選んでプロジェクトを作成すると、ソリューションエクスプローラのコンテキストメニューに何も出てきません。

f:id:shiba-yan:20160928001210p:plain

認証なし以外のテンプレートを選んで作成すると、今まで通りにスキャフォールディングの項目が表示されます。Visual Studio でスキャフォールディングが使えると安心感がありますね。

f:id:shiba-yan:20160928001249p:plain

違いは project.json だけなので、認証なしを選んでいてもパッケージをいくつか追加すると、スキャフォールディングを有効にすることが出来ます。具体的には以下の二つのパッケージを追加します。

  • Microsoft.VisualStudio.Web.CodeGeneration.Tools
  • Microsoft.VisualStudio.Web.CodeGenerators.Mvc

ただし、この二つはビルド時のみ必要な依存関係なので、type = build を設定しておきます。あと Visual Studio から認識させるために tools にも追記しないといけないので、project.json をそのまま載せます。

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.0.1",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    }
  },

  "tools": {
    "BundlerMinifier.Core": "2.0.238",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": [
        "portable-net45+win8"
      ]
    }
  }
}

ちょっとめんどくさいですけど dependencies の type については、Microsoft.NETCore.App を NuGet で単純にアップデートした時に悩むポイントなので、覚えておいてもいい気がしました。

保存してパッケージの復元が終わるとスキャフォールディングが使えるようになります。

f:id:shiba-yan:20160928001807p:plain

これでめでたしと行きたいところですが、今のバージョンのスキャフォールディングには保存時に UTF-8 にならないので、実行時に文字化けするという問題があります。割と毎度のことですが、生成されるファイルに BOM が付いていないのが原因です。*1

スキャフォールディングについても GitHub でコードが公開されているので、Issue を投げておきましたが間違った修正をされてしまったみたいで、結局まだ直っていないという話でした。

*1:そもそも UTF-8 には BOM は要らないという話ですけど、Visual Studio の仕様なので仕方ない