1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

dotnet publishコマンドで発行プロファイル(.pubxml)を指定してフォルダ配置を行う方法

Last updated at Posted at 2023-03-20

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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?