ASPNETCORE_ENVIRONMENTを設定してasp.netコアアプリケーションを公開するために考慮されるようにする方法


104

asp.netコアWebアプリケーションをローカルファイルシステムに公開すると、常にproduction-configとASPNETCORE_ENVIRONMENT変数に値= "Production"が設定されます。

ASPNETCORE_ENVIRONMENT変数の値を設定する必要がある方法と場所は、デバッグだけでなく公開でも考慮されるようにするためですか?私はすでに次のオプションを試しましたが成功しませんでした:

  • Windows設定で
  • .pubxmlファイル
  • launchSettings.json内
  • project.json

3
公式ドキュメントdocs.microsoft.com/en-us/aspnet/core/fundamentals/environmentsまたはこのチュートリアルandrewlock.net/…を読んでいますか?
J. Doe


1
stackoverflow.com/questions/43493259/…これには、実際のエラーをチェックする2つのオプションがあります。
クルクラ

回答:


84

上記のオプション以外にも、いくつかのソリューションがあります。

1.プロジェクトファイル(.CsProj)ファイルの変更

MSBuildは、EnvironmentName展開する環境ごとに適切な環境変数を設定するのに役立つプロパティをサポートしています。環境名は、公開フェーズ中にweb.configに追加されます。

プロジェクトファイル(* .csProj)を開き、次のXMLを追加するだけです。

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

上記のコードはDevelopment、デバッグ構成の場合、または構成が指定されていない場合、環境名を追加します。その他の構成の場合、環境名はProduction生成されたweb.configファイルに含まれます。詳細はこちら

2.パブリッシュプロファイルにEnvironmentNameプロパティを追加します。

<EnvironmentName>プロパティをパブリッシュプロファイルに追加することもできます。にある発行プロファイルファイルを開きます。これProperties/PublishProfiles/{profilename.pubxml}により、プロジェクトの発行時にweb.configに環境名が設定されます。詳細はこちら

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. dotnet publishを使用したコマンドラインオプション

さらに、プロパティEnvironmentNameをコマンドラインオプションとしてコマンドに渡すことができますdotnet publish。次のコマンドにはDevelopment、web.configファイルのように環境変数が含まれます。

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development


7
私の知る限り、これは最良の答えのようです。パブリッシュプロファイルごとに設定できることは、本当に役立ちました。
Jonathan Quinth、

3番目のオプションは私にとってはうまくいきます。/ p:EnvironmentNameオプションがdotnetドキュメントのどこかに言及しているかどうか知っていますか?
rasyadi

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentまさに私が探していたものです。ありがとう!
マットM

誰かがUAT、QA、またはプロダクションに公開したい場合の完全な「dotnet公開...」について教えてください。
crazyTech

74

オプション1:

WindowsでASPNETCORE_ENVIRONMENT環境変数を設定するには、

コマンドライン - setx ASPNETCORE_ENVIRONMENT "Development"

パワーシェル - $Env:ASPNETCORE_ENVIRONMENT = "Development"

他のOSについては、これを参照してください-https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

オプション2:

ASPNETCORE_ENVIRONMENTを使用して設定する場合web.configは、次のaspNetCoreように追加します

<configuration>
  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

42
これらはどちらもひどいオプションです。1)これをOS全体に設定します。IISのサイトごとに設定します。2)AspNet Coreはweb.config変換をサポートしていません。web.configが展開用に変更されることをどのように提案しますか?
Kugel 2017年

ここで公式ドキュメントを参照してください-docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket

5
より良いオプションに出会ったら、ここで共有してください:)
Sanket

5
この種の構成設計は非常に厄介です。
koo9 2018年

2
これは、複数の環境の発行プロファイルで上書きできます。
cederlof

31

Visual Studio IDEで設定する簡単な方法。

プロジェクト>プロパティ>デバッグ>環境変数

ここに画像の説明を入力してください


3
ただし、別の環境に公開する必要があるたびに、これを変更することを覚えておく必要があります。
Alisson 2018

15
不正解です。これはIDEを実行しているときにのみ機能します。Visual Studioのものであるlaunchsettings.jsonファイルに保存します。展開では機能しません。
onefootswill 2018年

21

を使用して、ドキュメントに記載されている指示に従う必要がありますweb.config

<aspNetCore processPath="dotnet"
        arguments=".\MyApp.dll"
        stdoutLogEnabled="false"
        stdoutLogFile="\\?\%home%\LogFiles\aspnetcore-stdout">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

他の環境変数も設定できることに注意してください。

ASP.NET Core Moduleを使用すると、aspNetCore要素の下のenvironmentVariablesコレクション要素の1つ以上のenvironmentVariable子要素で環境変数を指定することにより、processPath属性で指定されたプロセスの環境変数を指定できます。このセクションで設定された環境変数は、プロセスのシステム環境変数よりも優先されます。


.netコアコンソールアプリでどのように設定しますか?
user441365 2018

Windowsの[環境変数]ダイアログから設定します。
デビッドパイン

1
しかし、OSではなくプロジェクトでそれを設定する方法はありますか?
user441365

私が知っている.NET Coreのコンソールアプリは対象外です...いいえ-多分これ-stackoverflow.com/a/46445432/2410379
デビッドパイン

15

これは、実行時に設定できる方法です。

public class Program
{
    public static void Main(string[] args)
    {
        Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");

        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

なぜこれが反対票が投じられたのかわからない、それが私のために働いた唯一のものだからだ。
pcalkins

1
コードにハードコードされた値が原因である可能性が高いです。
Kevin C.

テストは最速ですが、チェックインされたコードとして長期的に見たいものではありません。
ブレットリグビー

これはハードコーディングされていますが、これは最も簡単な方法だと思います。
ゴーイング・ゴーン

1
私の優先する方法は、正しい値を設定するためにDEBUGと組み合わせて使用​​する方法です。
Dave de Jong

6

dotnet cliの最新バージョン(2.1.400以降)では、このmsbuildプロパティ$(EnvironmentName)を設定するだけで、パブリッシュツールが環境名を使用してweb.configにASPNETCORE_ENVIRONMENTを追加します。

また、XDTのサポートは2.2.100-preview1から利用できます。

サンプル:https : //github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
詳細について、you can just set this msbuild property $(EnvironmentName) and publishまたは参照を提供できますか?
DanElliott

1
.netコアコンソールアプリでどのように設定しますか?
user441365 2018

5
  1. appsettings。*。jsonファイルを作成します。(例:appsettings.Development.json、appsettings.Staging.json、appsettings.Production.json)

  2. これらのファイルに変数を追加します。

  3. 通常どおり、環境ごとに個別のパブリッシュプロファイルを作成します。

  4. PublishProfiles / Development.pubxmlを開きます(名前は、発行プロファイルの名前に基づいて決まります)。

  5. PublishProfileにタグを追加してEnvironmentName変数を設定するだけで、あとはappsettings。*。jsonファイルの命名規則に従って行われます。

    <PropertyGroup>
      <EnvironmentName>Development</EnvironmentName>
    </PropertyGroup>

リファレンス:https : //docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

「環境の設定」セクションを参照してください。


3

この変数はjsonに保存できます。たとえば、以下のような内容のenvsettings.json

  {
   // Possible string values reported below. When empty it use ENV variable value or 
     // Visual Studio setting.
     // - Production
     // - Staging
     // - Test
     // - Development

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

後でprogram.csを以下のように変更します

  public class Program
  {
    public static IConfiguration Configuration { get; set; }
    public static void Main(string[] args)
    {
        var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var environmentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

        var builder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
          var webHostBuilder = new WebHostBuilder()
            .UseKestrel()
            .CaptureStartupErrors(true)
            .UseContentRoot(currentDirectoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>();

        // If none is set it use Operative System hosting enviroment
        if (!string.IsNullOrWhiteSpace(environmentValue))
        {
            webHostBuilder.UseEnvironment(environmentValue);
        }

        var host = webHostBuilder.Build();

        host.Run();
     }
 }

これにより、常にパブリッシュに含まれ、Webサイトがホストされている環境に応じて必要な値に変更できます。変更はProgram.csにあるため、このメソッドはコンソールアプリでも使用できます。


0

Azure platorm(使用する場合)でこの変数を直接設定することで、私はそれが機能していることがわかりました。Webアプリ->構成->アプリケーション設定を選択し、変数とその値を追加して、[保存]ボタンを押すだけです。


0

サイトごとに環境を設定できるようにするためにプロジェクトで使用する他のオプションは、次の内容でParameters.xmlファイルをプロジェクトに追加することです。

<parameters>
      <parameter name="IIS Web Application Name" defaultValue="MyApp" tags="IisApp" />    
      <parameter name="Environment" description="Environment" tags="">
        <parameterEntry kind="XmlFile" scope="Web.config"  match="/configuration/location/system.webServer/aspNetCore/environmentVariables/environmentVariable[@name='ASPNETCORE_ENVIRONMENT']/@value" />
      </parameter>    
</parameters>

このファイルのビルドアクションはコンテンツであり、コピーアクションは新しい場合にコピーであるため、展開するパッケージの一部になります。

次に、パッケージを展開して環境を設定するには、リリースの「WinRM-IIS Webアプリの展開」タスク(「IIS Webアプリの展開」タスクを使用する場合も同様に機能します)で、msdeployに追加の引数を設定します。 :

-setParam:kind=ProviderPath,scope=contentPath,value="MySite" -setParam:name="Environment",value="Stage"

このようにして、すべて同じアーティファクトを使用しながら、異なる環境としてデプロイされた複数のリリースを使用できます。


0

私はこれが古い投稿であることを知っていますが、誰もそれを提案していないので、私の簡単な解決策をミックスに投入すると思いました。

現在のディレクトリを使用して現在の環境を特定し、接続文字列と環境変数を反転します。これは、test / beta / sandboxなどのサイトフォルダーの命名規則がある限り、うまく機能します。

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var dir = Environment.CurrentDirectory;
        string connectionString;

        if (dir.Contains("test", StringComparison.OrdinalIgnoreCase))
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
        }
        else
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Production");
        }

        optionsBuilder.UseSqlServer(connectionString);
        optionsBuilder.UseLazyLoadingProxies();
        optionsBuilder.EnableSensitiveDataLogging();
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.