web-dev-qa-db-ja.com

.net Core 2.0で環境変数を設定する

.net core 2.0アプリケーションで複数環境を設定しようとしています。以下のコードを参照してください。

構成ファイル(Launch.JSON)

"configurations": [
    {
        "name": ".NET Core Launch (web)",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "build",
        // If you have changed target frameworks, make sure to update the program path.
        "program": "${workspaceRoot}/my.api/bin/Debug/netcoreapp2.0/my.api.dll",
        "args": [],
        "cwd": "${workspaceRoot}/my.api",
        "stopAtEntry": false,
        "requireExactSource": false,
        "internalConsoleOptions": "openOnSessionStart",
        "launchBrowser": {
            "enabled": true,
            "args": "${auto-detect-url}",
            "windows": {
                "command": "cmd.exe",
                "args": "/C start ${auto-detect-url}"
            },
            "osx": {
                "command": "open"
            },
            "linux": {
                "command": "xdg-open"
            }
        },
        "env": {
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "sourceFileMap": {
            "/Views": "${workspaceRoot}/Views"
        }
    },
    {
        "name": ".NET Core Attach",
        "type": "coreclr",
        "request": "attach",
        "processId": "${command:pickProcess}"
    }
]

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

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

StartUp.cs

 public class Startup
{
    public IContainer ApplicationContainer { get; private set; }
    private IHostingEnvironment HostingEnvironment { get; set; }
    public IConfigurationRoot Configuration { get; }
    private string ConnectionString
    {
        get
        {
            return this.HostingEnvironment.IsDevelopment() ? Configuration.GetConnectionString("DefaultConnection") : Configuration.GetConnectionString("Production");
        }
    }
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()  
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.Development.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.Azuredev.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();

        this.HostingEnvironment = env;         

        System.Console.WriteLine(env.EnvironmentName); //here it always give me Production.
    }

私の問題

dotnet run --environment "Development"のようなコマンドラインを使用しようとしました

したがって、それは開発環境で実行する必要がありますが、常にProdution、(startup.csでconsole.writelineを追加したように見えます)

奇妙なことに、F5を使用してデバッグすると、開発環境で完全に実行されます。

12
Bharat

Launchsettings.jsonを更新して「開発」プロファイルを含め、次を実行できます。

dotnet run --launch-profile "Development"

LaunchSettings.jsonファイルの構成の詳細については、「 複数の環境での作業 」を参照してください。

CommandNameはおそらく「Project」である必要があることに注意してください(私は実際にこれほど試したことはありません)。以下のlaunchSettings.jsonの例:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:19882/",
      "sslPort": 0
    }
  },
  "profiles": {
    "Development": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
11
CalC

最後にやった..

私がこれを達成した方法を見てみましょう。

  1. LaunchSettings.JSONにすべてのプロファイル設定を追加しました
  2. Program.csは、質問で追加したものと同じままです。
  3. 更新されたstartup.cs(以下を参照)
  4. 端末から実行するためのCLIも異なります。

まず、プロジェクトの構造を見てみましょう。

enter image description here

launchSettings.jsonのコード

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40088/",
      "sslPort": 0
    }
  },
  "profiles": {
    "Development": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Azuredev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Azuredev"
      }
    }
  }
}

Launch.jsonのコード

{     
"version": "0.2.0",
"configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceRoot}/my.api/bin/Debug/netcoreapp2.0/my.api.dll",
            "args": [],
            "cwd": "${workspaceRoot}/my.api",
            "stopAtEntry": false,
            "requireExactSource": false,
            "internalConsoleOptions": "openOnSessionStart",
            "launchBrowser": {
                "enabled": true,
                "args": "${auto-detect-url}",
                "windows": {
                    "command": "cmd.exe",
                    "args": "/C start ${auto-detect-url}"
                },
                "osx": {
                    "command": "open"
                },
                "linux": {
                    "command": "xdg-open"
                }
            },
            "sourceFileMap": {
                "/Views": "${workspaceRoot}/Views"
            }
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}

startup.cs

    public IConfigurationRoot Configuration { get; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()  
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();

        this.HostingEnvironment = env;        
    }

このすべての変更後、私のAPIはF5デバッグオプションとCLIターミナルの両方で正常に動作しています。

コマンドラインからアプリケーションを起動するには、このキーワードを使用します。

dotnet run --launch-profile "開発"

OR

dotnet run --launch-profile "Azuredev"

5
Bharat

dotnet run --environmentASPNETCORE_ENVIRONMENT環境変数には影響しません。 この問題 を参照してください。

以下に、複数の方法で環境を切り替える方法の詳細な手順を示します。 https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/environments

たとえば、コマンドラインから(dotnet runの前に)実行できます:set ASPNETCORE_ENVIRONMENT=Development

2
astef

コマンドターミナルで次のコマンドを使用して、環境を設定できます。

setx ASPNETCORE_ENVIRONMENT "Environment_Name"

環境名は、開発、ステージング、または本番です

環境変数は現在開いているウィンドウでは設定されないことに注意してください。更新された環境を表示するには、新しいコマンドプロンプトを開く必要があります。管理コマンドプロンプトを開き、/ Mスイッチを追加すると、(ユーザー変数だけでなく)システム変数を設定することもできます。

参照用

1
Akbar Badhusha