銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

.NET Core on RHEL で csproj をいじってみる

.NET Core に MSBuild がα版としてリリースされました。

blogs.msdn.microsoft.com

ちなみに、これは同じタイミングでリリースされた.NET Core 1.1には同梱されておらず、.NET Core 1.0 の preview3 に同梱されています*1。で、先のブログのリンク先にダウンロードリンクがリストされているのですが...

github.com

RHEL7.2がのってなかったりします*2。ただ、だからといってRHEL7.2向けでMSBuildが利用できるバイナリがないのかというと、そういうわけでもなくて、.NET CLIのリポジトリをみに行くとDaily Buildのリンクが用意されています。

github.com

Red Hat がサポートしている Software Collections経由でのインストールはできないので、FedoraやCentOSと同様にダウンロードした後に次のコマンドで解凍します。

$ sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin

Software Collections経由で入れる場合とは違う場所に解凍され、またPATHも通っていないので、PATHを通すようにするかフルパス指定で利用できるようになります。これでdotnet newすると .csproj とProgram.cs が生成されます。Visual Studioではお馴染みのcsprojですが、LinuxでVisual Studio Codeみると新鮮さがあります。

f:id:tanaka733:20161118172402p:plain

既存のproject.jsonなやつは dotnet migrate で変換できます。確認などはなく一気に変換してしまうので心の準備ができてからどうぞ。変換されたproject.jsonはbackupディレクトリの中に保存されています。

$ /opt/dotnet/dotnet migrate
Project test2 migration succeeded (/home/tatanaka/Documents/demo2/test2)
Summary
Total Projects: 1
Succeeded Projects: 1
Failed Projects: 0
$ ls backup/
project.json

*1:.NET Core Runtimeは正式版だけど、toolingが未だプレビューなのでわりづらいバージョン表記に

*2:そもそもRHELの最新版は7.3になったのですが、そこは生温かい目で

Connect(); 2016 での Linux関連の発表まとめ

ぐぐらびりてぃの低さで有名*1なConnect();の1日目のキーノートが終わりました。Linux関連*2での新機能等の発表をまとめてみました。

ニュース系

MicrosoftがLinux Foundationのプラチナメンバーに

www.linux.com

SamsungがMicrosoftと協力して、Tizen上で動くアプリを.NET で開発できるように

Xamarin.Formベースのなにか、でVisual Studio Tools for Tizenで開発できるとか

developer.tizen.org

開発ツール系

Visual Studio 2017 RC

次期Visual Studioとなる2017のリリース候補版が公開されました。IntelliSenseやNavigationなどの機能強化、Azure Container Serviceの連携といった、現行バージョンでは拡張として提供されていた機能がVS本体に取り込みなどが行われています。Visual Studio拡張についても変更が発表されていました。

blogs.msdn.microsoft.com

blogs.msdn.microsoft.com

.NET Core/ASP.NET Core/EF Core 1.1 公開

.NET Core 1.1で待望のFedora24サポートです。他にも対応ディストリが増えています。また、.NET Standard 1.6をサポートしました。.NET Standard 2.0*3は次期リリースでの対応予定です。

blogs.msdn.microsoft.com

また、微妙に場所がバラバラだった各種ドキュメントが docs.microsoft.com に集約されました。

docs.microsoft.com

.NET Core Tools MSBuild “alpha” リリース

MSBuildがLinuxの世界にやってきました。project.jsonから*.csprojになります。Tooling系はいまだにpreview3という正式リリース前という状態になっています。

ASP.NET Core MVCが TechEmpower round13 で素晴らしいベンチマーク結果

Linux上でのベンチマーク結果になります。ASP.NET Core 1.1の新機能としては、URL RewriteやResponse CachingといったIISでできていた機能がMiddlewareで追加できるようになっています。

blogs.msdn.microsoft.com

Visual Studio Tools for Docker 機能強化

複数プロジェクトのデバックサポートとか、Azure Container Servicesとの連携強化など。VS2017では本体に取り込まれる予定です。

Azure系

Azure App Service on LinuxがContainerとASP.NET Coreをサポート

Azure Container Sercice機能強化

11/7に発表済みですが、OSS化された上で、kubernetesのサポートとかAzure Container Registry(preview)の追加などが行われています。

azure.microsoft.com

Dataplatform系

SQL Server on LinuxがPublic Preview

ついに、ようやく、ですね。本日よりPublic Preview開始です。Container上でも動くようです。

blogs.technet.microsoft.com

SQL Server v.Next—SQL Server on Linux | Microsoft

Visual Studio Code extension for SQL

SQLServer の強みはRDBMSそのものだけではなくて、GUIによる管理ツールにもあったりするのですが、Linuxにもその強みを活かそうということなのか、Visual Studio Code拡張としてツールが公開されました。

marketplace.visualstudio.com

というわけで、Linuxに関連しそうな内容だけでも盛り沢山のリリースでした。それぞれの詳細については、別途ブログにしたいと思います。

*1:Microsoft Connectで検索しても本家のフィードバックサイトが出てくるという

*2:なにがLinux関連でなにが違うのかは独断と偏見

*3:1.6からの互換性がなくなる例外的なリリース

Entity Framework Core で PostgreSQL のAutoIncrement列を使う場合の注意

Entity Framework Core でModel FirstでAutoIncrementな主キーを定義するときはモデルクラスをこのように定義すると思います。

public class ToDo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int Id { get; set; }

    [Required, MaxLength(512)]
    public string Description { get; set; }

    public bool Complete { get; set; }
}

sqliteなどはこれでいいのですが、PostgreSQLを使う場合は注意が必要です。dotnet ef migrations add First などでMigrationスクリプトを生成した後にひと手間加えます。

Id = table.Column<int>(nullable: false)
    .Annotation("Autoincrement", true)
    .Annotation("Npgsql:ValueGeneratedOnAdd", true), //この行を追加

主キーのカラムを定義しているスクリプトで、Npgsqlのアノテーションを追加します。これが今後の確定した仕様になるかはわからないのですが、現状はこれを加えないと自動生成=PostgreSQLの場合はカラムをSerial型として定義、が動かず、普通の数値型として定義されてしまいます。詳細はこちらのIssueで議論され、いったんはこれでクローズされています。

github.com