como definir ASPNETCORE_ENVIRONMENT para ser considerado para publicar um aplicativo principal asp.net?


104

quando eu publico meu aplicativo da web principal do asp.net em meu sistema de arquivos local, ele sempre leva a configuração de produção e a variável ASPNETCORE_ENVIRONMENT com o valor = "Production".

como e onde devo definir o valor da variável ASPNETCORE_ENVIRONMENT para que seja considerado não apenas para depuração, mas também para publicação ? já tentei as seguintes opções sem sucesso:

  • nas configurações do Windows
  • no arquivo .pubxml
  • em launchSettings.json
  • em project.json

3
Você lê os documentos oficiais docs.microsoft.com/en-us/aspnet/core/fundamentals/environments ou este tutorial andrewlock.net/… ?
J. Doe


1
stackoverflow.com/questions/43493259/… isto tem 2 opções para verificar o erro real.
Kurkula

Respostas:


84

Além das opções mencionadas acima, existem algumas outras soluções.

1. Modificando o arquivo de projeto (.CsProj)

O MSBuild oferece suporte à EnvironmentNamepropriedade que pode ajudar a definir a variável de ambiente certa de acordo com o ambiente que você deseja implantar. O nome do ambiente seria adicionado ao web.config durante a fase de Publicação.

Basta abrir o arquivo de projeto (* .csProj) e adicionar o seguinte 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>

O código acima adicionaria o nome do ambiente como Developmentpara a configuração de depuração ou se nenhuma configuração for especificada. Para qualquer outra configuração, o nome do ambiente estaria Productionno arquivo web.config gerado. Mais detalhes aqui

2. Adicionando a propriedade EnvironmentName nos perfis de publicação.

Podemos adicionar a <EnvironmentName>propriedade no perfil de publicação também. Abra o arquivo de perfil de publicação localizado em Properties/PublishProfiles/{profilename.pubxml}Isso definirá o nome do ambiente em web.config quando o projeto for publicado. Mais detalhes aqui

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

3. Opções de linha de comando usando dotnet publish

Além disso, podemos passar a propriedade EnvironmentNamecomo uma opção de linha de comando para o dotnet publishcomando. O comando a seguir incluiria a variável de ambiente como Developmentno arquivo web.config.

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


7
Esta parece ser a melhor resposta, pelo que posso dizer. A capacidade de defini-lo por perfil de publicação realmente me ajudou muito.
Jonathan Quinth

A terceira opção funciona para mim. Você sabe se a opção / p: EnvironmentName menciona qualquer lugar na documentação do dotnet?
rasyadi

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmenté exatamente o que eu estava procurando. Obrigado!
Matt M

Você poderia indicar qual seria a 'publicação dotnet ....' se alguém quisesse publicar no UAT, QA ou Produção?
crazyTech

74

Opção 1:

Para definir a variável de ambiente ASPNETCORE_ENVIRONMENT no Windows,

Linha de comando - setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"

Para outro sistema operacional, consulte - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

Opção 2:

Se você deseja definir ASPNETCORE_ENVIRONMENT usando web.configseguida, adicione aspNetCorecomo this-

<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
Ambas as opções são terríveis. 1) define isso para todo o sistema operacional, eu gostaria por site no IIS. 2) AspNet Core não suporta transformações web.config. Como você sugere que o web.config seja modificado para implantação?
Kugel


5
Assim que você encontrar a melhor opção ... por favor, compartilhe aqui :)
Sanket

5
esse tipo de projeto de configuração parece muito confuso.
koo9

2
Você pode substituir isso nos perfis de publicação para vários ambientes.
cederlof de

31

Maneira simples de configurá-lo no IDE do Visual Studio.

Projeto> Propriedades> Depurar> Variáveis ​​de ambiente

insira a descrição da imagem aqui


3
Mas então você precisa se lembrar de alterar isso sempre que precisar publicar em um ambiente diferente.
Alisson

15
Isso não é correto. Isso só funciona ao executar o IDE. Armazena no arquivo launchsettings.json, que é uma coisa do Visual Studio. Não funcionará para implantações.
onefootswill

21

Você deve seguir as instruções fornecidas na documentação , usando o 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>

Observe que você também pode definir outras variáveis ​​de ambiente.

O Módulo ASP.NET Core permite que você especifique variáveis ​​de ambiente para o processo especificado no atributo processPath, especificando-as em um ou mais elementos filho de environmentVariable de um elemento de coleção de environmentVariables sob o elemento aspNetCore. As variáveis ​​de ambiente definidas nesta seção têm precedência sobre as variáveis ​​de ambiente do sistema para o processo.


como eu o configuraria em um aplicativo de console principal .net?
user441365

Configure-os por meio da caixa de diálogo Variáveis ​​de ambiente do Windows.
David Pine

1
Mas existe uma maneira de configurá-lo no projeto em vez do sistema operacional?
user441365

Não para aplicativos de console em .NET Core que eu conheça ... não - talvez isso - stackoverflow.com/a/46445432/2410379 ?
David Pine

15

É assim que podemos definir em tempo de execução:

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();
}

não tenho certeza por que isso foi votado contra, porque é a única coisa que funcionou para mim.
pcalkins

1
Provavelmente foi rejeitado devido aos valores embutidos no código.
Kevin C.

Mais rápido para testar, mas concordo que não é algo que gostaria de ver como código de check-in, a longo prazo.
Brett Rigby

embora seja codificado, considero a maneira mais fácil de fazer isso.
Indo-ido

1
Meu método preferido, eu o uso em combinação com DEBUG para definir o valor correto.
Dave de Jong

6

Com a versão mais recente do dotnet cli (2.1.400 ou superior), você pode apenas definir esta propriedade msbuild $(EnvironmentName) e as ferramentas de publicação se encarregarão de adicionar ASPNETCORE_ENVIRONMENT ao web.config com o nome do ambiente.

Além disso, o suporte XDT está disponível a partir de 2.2.100-preview1.

Amostra: https://github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
Você poderia elaborar you can just set this msbuild property $(EnvironmentName) and publishou fornecer uma referência?
DanElliott 01 de

1
como eu o configuraria em um aplicativo de console principal .net?
user441365

5
  1. Crie seus arquivos appsettings. *. Json. (Exemplos: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. Adicione suas variáveis ​​a esses arquivos.

  3. Crie um perfil de publicação separado para cada ambiente, como faria normalmente.

  4. Abra PublishProfiles / Development.pubxml (a nomenclatura será baseada no nome que você chamou de Perfil de Publicação).

  5. Basta adicionar uma tag ao PublishProfile para definir a variável EnvironmentName , a convenção de nomenclatura do arquivo appsettings. *. Json faz o resto.

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

Referência: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

Consulte a seção “Definir o ambiente”.


3

Esta variável pode ser salva em json. Por exemplo envsettings.json com o conteúdo abaixo

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

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

Posteriormente, modifique seu program.cs conforme abaixo

  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();
     }
 }

Dessa forma, ele sempre será incluído na publicação e você pode alterar para o valor necessário de acordo com o ambiente onde o site está hospedado. Este método também pode ser usado no aplicativo de console, pois as alterações estão em Program.cs


0

Achei que funcionava para mim, definindo essa variável diretamente no Azure platorm (se você usá-lo). Basta selecionar seu aplicativo da web -> configuração -> configurações do aplicativo e adicionar a variável e seu valor, em seguida, pressione o botão Salvar.


0

Outra opção que usamos em nossos projetos para poder definir o ambiente por site é adicionar um arquivo Parameters.xml ao projeto com o seguinte conteúdo:

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

A ação de construção para este arquivo é Conteúdo e a ação de cópia é Copiar se mais recente, portanto, fará parte do pacote a ser implantado.

Em seguida, para implantar o pacote e definir o ambiente, na versão, na tarefa "WinRM - IIS Web App Deployment" (funciona tão bem ao usar a tarefa "IIS web app deploy"), definimos argumentos adicionais para msdeploy :

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

Dessa forma, podemos ter vários lançamentos, todos usando o mesmo artefato, mas implantados em ambientes diferentes.


0

Eu sei que este é um post antigo, mas pensei em jogar minha solução simples na mistura, já que ninguém sugeriu.

Eu uso o diretório atual para determinar o ambiente atual e, em seguida, viro a string de conexão e a variável de ambiente. Isso funciona muito bem, desde que você tenha uma convenção de nomenclatura para as pastas do seu site, como 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();
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.