dotnet publish
コマンドを使い、発行プロファイル(.pubxml)を指定して、WebPublishMethod=FileSystem
による発行を行う場合の注意事項をメモ書きでまとめる。
尚、この内容は.NET Core 3.1と.NET 5環境で試しているが、様々な要因が重なっており、何が影響を及ぼしているのか完全には分かっていない為、間違っている可能性も高いことに留意されたい。
今後間違いに気づいた場合はこの記事を随時修正していく。
参考URL:.NET6での発行プロファイルによるコマンドライン発行
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-6.0
私が良く使うコマンドライン引数の例
dotnet publish App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 -p:EnvironmentName=Production --output "C:\deploy\Release\App1"
以下に一つ一つ説明する。
-p:
の引数は、msbuildに渡される引数
dotnet publish
が行っているのは、msbuildを内部的に呼び出してビルドを行い、結果を指定場所に発行する、という処理になる。
その為、msbuildに渡す引数を-p:PropName=PropValue
で指定できる。
ビルド構成の指定(Release/Debug/Staging)
-p:Configuration はビルド構成を与えるオプションであり、-c と同じように見えるが、参考URLによれば publishの場合はこちらを指定するらしい。
逆にdotnet build
では -c オプションを指定する。直感的には逆じゃないのかと思ってしまう。
コマンドの実行結果にdllの出力結果がフルパスで表示されるので、そこが正しく「Release」(Releaseビルドを指定した場合)になっているかを確認すること。
-p:PublishProfileに指定するのは「プロファイル名」
- profile1.pubxml ではなく profile1
- フルパスで指定する方法はいまだにわからない
尚、.csprojのパス指定はカレントディレクトリからの相対パスで行けるが、その場合でもこのPublishProfile指定は「プロファイル名」だけで良い。
対象のプロジェクトが決まったら、そこからProperties/PublishProfiles/{PROFILE NAME}.pubxml
が検索されるようだ。
dotnet publish App1/App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 -p:EnvironmentName=Production --output "C:\deploy\Release\App1"
注意点として、プロファイル名の指定が間違っていても、コマンドはエラーを吐いてくれない。
なので、例えば<EnvironmentName>hogehoge</EnvironmentName>
をpubxmlに指定し、出力結果のweb.configに正しくhogehoge
がASPNETCORE_ENVIRONMENTとして設定されているか確認することで、コマンドが正しくプロファイルの場所を認識しているか確認すると良い。
pubxmlのPublishUrlは無視されるので--ouputオプションを指定する
<PublishUrl>C:\deploy\Release\App1</PublishUrl>
上記のように書いてあっても無視され、出力先は以下のようにbin\{PROJECT CONFIGURATION}\{TARGET FRAMEWORK MONIKER}\publish\
というフォルダとなる。
(この例は、.NET5.0で、win-x64向けのReleaseビルドを行った場合)。
bin\Release\net5.0\win-x64\publish\
dotnet publish
コマンドの引数に```--output "C:\deploy\Release\App1" を追加すると、出力先を指定できる。
dotnet publish App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 --output "C:\deploy\Release\App1"
EnvironmentNameの設定
ASPNETCORE_ENVIRONMENT環境変数を指定する為の設定。web.configに反映され、最終的にはappsettings.*.jsonの選択が行われる(Developmentならばappsettings.Development.jsonが追加で読み込まれて反映される)。
基本的には、pubxmlにEnvironmentNameプロパティを追加する。
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
ちなみに、EnvironmentNameプロパティがないpubxmlをdotnet publish
を使って発行したら、web.configにDevelopment
が書き込まれた。
この値がどこからやってきた規定値なのか今のところわかっていない。
また、コマンドラインから指定する場合、次のように書く。こうすると、pubxmlの値を置き換えて実行できる。
dotnet publish App1.csproj -p:Configuration=Release -p:PublishProfile=Profile1 -p:EnvironmentName=Production --output "C:\deploy\Release\App1"
pubxmlの値をコマンドライン引数で置きかえできるかは試してみないとわからない
これまで見てきたように、aaaというpuxmlのプロパティは、-p:XXX=aaa
というコマンドライン引数で置き換えできることが多い。
しかし、どのプロパティが置き換え可能かは、実際に実験してみないとダメだろう。
トラブルシューティング
.StaticWebAssets.xml" は見つからなかったためコピーできません
このエラーが出たら、dotnet restore を試してみると良い。
dotnet restore