XamarinでMacとペアリンクしようとしたら、mono のバージョンが違うので更新して失敗したので、ダウンロード先のURLを乗せておく

2019年6月10日 コメントを残す

Microsoft Docsの Xamarin.iOS 開発のために Mac とペアリングするを参考にペアリングしていたんだけれど、MacとWindowsでmonoのバージョンが異なるので更新しろよと怒られた

更新しようとしたら、今度はダウンロードできないと怒られた。

ダウンロードURLをコピーしようとしても、コピーできないので頑張って手打ちしたので残しておく。

https://download.visualstudio.microsoft.com/download/pr/0eabb814-ce2a-403d-85b4-32de207f8fd3/06b6c2afe15f06ca2d15fd45e784858e/monoframework-mdk-5.18.1.28.macos10.xamarin.universal.pkg

ダウンロードした後に、Visual Studioの出力ウインドウからコピーできることに気づいた、、、

広告
カテゴリー:未分類

dotnet ef migrations addでMSB4006がでてマイグレーションを追加できない場合は、-pオプションでDbContextが含まれているプロジェクトを指定する。

2019年5月13日 コメントを残す

こんな感じのソリューション構成で、

ソリューション
  +-- データコンテキストが含まれるプロジェクト
  +-- MVCが含まれるプロジェクト
  +-- Docker-Composeのプロジェクト

dotnet ef migrations add でマイグレーションを追加しようとしたら、こんなエラーが出た
実行したコマンド

cd ソリューション/データコンテキストが含まれるプロジェクト
dotnet ef migrations add addChangeXXXXX -c データコンテキストの名前 -s ../MVCが含まれるプロジェクト -o Migrations/IdpMigration

ログ

C:\workspace\localrepo\src\obj\docker-compose.dcproj.EntityFrameworkCore.targets(4,5): error MSB4006: ターゲット “GetEFProjectMetadata” で、ターゲット依存グラフに循環する依存関係が存在します。 [C:\workspace\loc
alrepo\src\docker-compose.dcproj]
Unable to retrieve project metadata. Ensure it’s an MSBuild-based .NET Core project. If you’re using custom BaseIntermediateOutputPath or MSBuildProjectExtensionsPath values, Use the –msbuildprojectextensionspath option.

検索するといくつか出てくるんだけれど、
https://stackoverflow.com/questions/42937017/vs-2017-add-docker-support-breaks-build-cleanworkspace-task-failed-unexpec/42938519#42938519

dotnet コマンドで Docker-Composeプロジェクト がビルドされるときに、相対パスでパスが解決できないのが問題っぽい、プロジェクト構成は変えたくないのでdotnet efコマンドにパラメーターを追加することで対応する。
今まではデータコンテキストが含まれるプロジェクトでdotnet efコマンドを実行していたので、ソリューションディレクトリから実行するようにして、-pパラメーターでデータコンテキストが含まれるプロジェクトを指定するようにした。

cd ソリューション
dotnet ef migrations add addChangeXXXXX -p ./データコンテキストが含まれるプロジェクト -c データコンテキストの名前 -s ../MVCが含まれるプロジェクト -o Migrations/IdpMigration
カテゴリー:ASP.NET, Docker

EntityFramework Coreでソースコードを利用しないでマイグレーションを行う

ソースコードありきのマイグレーション

EntityFramework Coreでデータベースのマイグレーションを実施する場合、スタートアッププロジェクトとDbContextが同じプロジェクトにあるのであれば、プロジェクトディレクトリで下記のような感じのコマンドを実行します。

dotnet ef database update

スタートアッププロジェクトとDbContextが別の場合で、さらにDbContextが複数あったりする場合はこんな感じになります。

dotnet ef database update -p [DbContextのあるプロジェクトのパス] -s [スタートアッププロジェクトのパス] -c [マイグレーションを実施するDbContext名]

成果物のみのマイグレーション

Publishで発行された成果物からデータベースのマイグレーションを実施する場合はdotnet efではなく、dotnet execを直にたたきます。

dotnet exec \
  --runtimeconfig ./[スタートアッププロジェクト].runtimeconfig.json \
  --depsfile ./[スタートアッププロジェクト].deps.json /usr/share/dotnet/sdk/NuGetFallbackFolder/microsoft.entityframeworkcore.tools/2.2.0/tools/netcoreapp2.0/any/ef.dll \
  --verbose database update \
  --context [マイグレーションを実施するDbContext名] \
  --assembly ./[DbContextが含まれるプロジェクト].dll \
  --startup-assembly ./[DbContextが含まれるプロジェクト].dll \
  --data-dir ./

runtimeconfig.jsonやWebApp.deps.jsonといったファイルはdotnet publishすると自動的に作られるのでこれを使います。ef.dllは環境によって場所が変わります。上のサンプルはmicrosoft/dotnet:2.2-sdkのコンテナイメージを使った場合のパスです。

… そうなんです。SDKイメージじゃないと動かないんです。SDKを使うならソースコードなんて誤差みたいなものなので、普通にソースコードを使ってマイグレーションをしてもいいんじゃね?となりました。

カテゴリー:ASP.NET, Docker

AzureADに参加後Docker for Desktopが起動しない場合、docker-usersにAzureADのユーザーを追加する

2019年4月25日 コメントを残す

AzureADに参加したコンピューターで、それまで動いていたDocker for Desktopが起動しなくなりました。
image

メッセージにある通り、ローカルPCのdocker-usersにAzureADのユーザーを追加してあげればいいんだけれど、WIndowsのGUIからいくらアカウントを指定しても、そんなユーザーはいないと言われる、、、

結局管理者で起動したコマンドプロンプトから追加してあげたらうまくいきました。

net localgroup docker-users azuread\[AzureAdのユーザーID]@[AzureADのドメイン] /add
カテゴリー:インフラ, Docker

.net core 3 以降のコンテナイメージは、MCRでしか公開されない?

.NET Core Container Images now Published to Microsoft Container Registry
https://devblogs.microsoft.com/dotnet/net-core-container-images-now-published-to-microsoft-container-registry/

1.X系と2.X系のDockerイメージはDockerHubで引き続き公開されるけれど、3.X系はAzureのDockerリポジトリーであるMicrosoftContainer Registry(MCR)でのみ公開されるみたいですね。

2.0はすでにEOLなので、MCRでは改めてホストされずDockerHubにだけあるみたいです。

カテゴリー:ASP.NET, Docker

Visual Studio 2019のAlpine対応

2019年4月8日 1件のコメント

Visual Studio 2019がRTMされましたね。

Visual Studio 2017を利用している場合、Visual Studio で Alpine をベースイメージにしている場合にデバックが失敗する問題がありました。Visual Studio 2019 で対応すると言うことだったので早速試してみることにしようと思います。

Visual Studio 2019でASP.NET CoreでDockerサポートを有効にした場合のDockerfileです。
DockerリポジトリがDockerHubからAzureのMCRに変更になっていますね。

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["WebApplication15/WebApplication15.csproj", "WebApplication15/"]
RUN dotnet restore "WebApplication15/WebApplication15.csproj"
COPY . .
WORKDIR "/src/WebApplication15"
RUN dotnet build "WebApplication15.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebApplication15.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication15.dll"]

この部分を、

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base

こうします。

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine AS base

bash を使ってコンテナを強制停止していたのが、shを利用するに変更されたみたいです。

1>------ ビルド開始: プロジェクト: WebApplication15, 構成: Debug Any CPU ------
1>docker exec -i 2f39a9a30f607e1a0cd9cee7043ebfceff83ec20112e91363acd971b9fadbeee /bin/sh -c "if PID=$(pidof dotnet); then kill $PID; fi"

コンテナのベースイメージの時点で100MB近い違いがあるので、プロダクションでの利用はできるだけこっちを使いたいですね。
vs2019-container-image

カテゴリー:ASP.NET, Docker

asp.net coreのコンテナ作成時にgulpを動かしてscssのコンパイルを行う。

2019年3月28日 コメントを残す

コンテナ作って動かしたらCSSあたってないよと言われて内容を確認する。
wwwroot/cssにcssがない、、、gulpのタスクが動いていないっぽい。
Visual StudioのタスクランナーでAfter Build などに指定しても、dotnet restoreでは実行してくれないので、自前にgulpを叩いてあげる必要があるみたいですね。

gulpfile.jsにこんな感じでscssのビルドタスクが登録されているとして

gulp.task("build:sass", () => {
    return gulp.src("./Assets/Sass/*.scss")
        .pipe(sass())
        .pipe(concat("site2.css"))
        .pipe(gulp.dest("wwwroot/css"));
});

... 略 ...

gulp.task("min", gulp.series(["min:js", "min:css"]));

// A 'default' task is required by Gulp v4
gulp.task("default", gulp.series(["min", "build:sass"]));

Dockerfileはこんな感じ、

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.2-sdk AS build
RUN apt update -yq && apt upgrade -yq && apt install -yq curl git nano
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && apt install -yq nodejs build-essential
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN npm install -g gulp && npm install && gulp
RUN dotnet build "WebApplication1.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

microsoft/dotnet:2.2-sdkにはnodeがインストールされていないので、nodeのビルドに必要なパッケージをaptでインストールしたあとに、gitからnodeのセットアップ一式を持ってきてインストールします。

RUN apt update -yq && apt upgrade -yq && apt install -yq curl git nano
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && apt install -yq nodejs build-essential

npmでgulpをグローバルインストールした後に、必要なモジュールをnpmで取得してgulpをキックします。

RUN npm install -g gulp && npm install && gulp

dockerignoreでnode_moduleを指定しておかないと、Windows環境などでビルドしていた場合にnode-sassのWindowsバイナリーがコピーされておかしくなってしまうので注意ですね。
.dockerignore

node_modules
カテゴリー:ASP.NET, Docker