come impostare ASPNETCORE_ENVIRONMENT da considerare per la pubblicazione di un'applicazione principale asp.net?


106

quando pubblico la mia applicazione web asp.net core nel mio file system locale, accetta sempre la configurazione di produzione e la variabile ASPNETCORE_ENVIRONMENT con il valore = "Produzione".

come e dove devo impostare il valore della variabile ASPNETCORE_ENVIRONMENT in modo che venga considerata non solo per il debugging, ma anche per la pubblicazione ? ho già provato le seguenti opzioni senza successo:

  • nelle impostazioni di Windows
  • nel file .pubxml
  • in launchSettings.json
  • in project.json

3
Hai letto i documenti ufficiali docs.microsoft.com/en-us/aspnet/core/fundamentals/environments o questo tutorial andrewlock.net/… ?
J. Doe


1
stackoverflow.com/questions/43493259/… questo ha 2 opzioni per controllare l'errore reale.
Kurkula

Risposte:


85

Oltre alle opzioni sopra menzionate, ci sono un paio di altre soluzioni.

1. Modifica del file del file di progetto (.CsProj)

MSBuild supporta la EnvironmentNameproprietà che può aiutare a impostare la giusta variabile di ambiente in base all'ambiente che si desidera distribuire. Il nome dell'ambiente verrebbe aggiunto nel web.config durante la fase di pubblicazione.

Basta aprire il file di progetto (* .csProj) e aggiungere il seguente 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>

Il codice precedente aggiungerebbe il nome dell'ambiente come Developmentper la configurazione di debug o se non viene specificata alcuna configurazione. Per qualsiasi altra configurazione, il nome dell'ambiente sarebbe Productionnel file web.config generato. Maggiori dettagli qui

2. Aggiunta della proprietà EnvironmentName nei profili di pubblicazione.

Possiamo aggiungere la <EnvironmentName>proprietà anche nel profilo di pubblicazione. Apri il file del profilo di pubblicazione che si trova in Properties/PublishProfiles/{profilename.pubxml}Questo imposterà il nome dell'ambiente in web.config quando il progetto viene pubblicato. Maggiori dettagli qui

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

3. Opzioni della riga di comando utilizzando dotnet publish

Inoltre, possiamo passare la proprietà EnvironmentNamecome opzione della riga di dotnet publishcomando al comando. Il seguente comando includerebbe la variabile d'ambiente come Developmentnel file web.config.

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


7
Questa sembra la migliore risposta per quanto ne so. La possibilità di impostarlo per profilo di pubblicazione mi ha davvero aiutato molto.
Jonathan Quinth

La terza opzione funziona per me. Sai se l'opzione / p: EnvironmentName è menzionata ovunque nella documentazione di dotnet?
rasyadi

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentè esattamente quello che stavo cercando. Grazie!
Matt M

Potresti per favore indicare quale sarebbe il "dotnet publish ..." completo se qualcuno volesse pubblicare su UAT, QA o Production?
crazyTech

75

Opzione 1:

Per impostare la variabile d'ambiente ASPNETCORE_ENVIRONMENT in Windows,

Riga di comando - setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"

Per altri sistemi operativi fare riferimento a: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

Opzione 2:

Se si desidera impostare ASPNETCORE_ENVIRONMENT utilizzando web.configquindi aggiungere aspNetCorecome questo-

<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
Entrambe sono opzioni terribili. 1) imposta questo per l'intero sistema operativo, lo vorrei per sito in IIS. 2) AspNet Core non supporta le trasformazioni web.config. Come suggerisci che web.config venga modificato per la distribuzione?
Kugel

Fare riferimento alla documentazione ufficiale qui: docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket

5
Una volta
trovata

5
questo tipo di progettazione della configurazione sembra molto complicato.
koo9

2
Puoi sovrascriverlo nei profili di pubblicazione per più ambienti.
cederlof

31

Modo semplice per impostarlo nell'IDE di Visual Studio.

Progetto> Proprietà> Debug> Variabili d'ambiente

inserisci qui la descrizione dell'immagine


3
Ma poi devi ricordare di cambiarlo ogni volta che devi pubblicare in un ambiente diverso.
Alisson

15
Non è corretto. Funziona solo quando si esegue l'IDE. Lo memorizza nel file launchsettings.json che è una cosa di Visual Studio. Non funzionerà per le distribuzioni.
onefootswill

21

È necessario seguire le istruzioni fornite nella documentazione , utilizzando il 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>

Nota che puoi anche impostare altre variabili d'ambiente.

Il modulo ASP.NET Core consente di specificare le variabili di ambiente per il processo specificato nell'attributo processPath specificandole in uno o più elementi figlio environmentVariable di un elemento della raccolta environmentVariables sotto l'elemento aspNetCore. Le variabili di ambiente impostate in questa sezione hanno la precedenza sulle variabili di ambiente di sistema per il processo.


come potrei impostarlo in un'app console .net core?
user441365

Impostali tramite la finestra di dialogo Variabili d'ambiente di Windows.
David Pine il

1
Ma c'è un modo per impostarlo nel progetto piuttosto che nel sistema operativo?
user441365

Non per le app console in .NET Core di cui sono a conoscenza ... no, forse questo - stackoverflow.com/a/46445432/2410379 ?
David Pine

15

Ecco come possiamo impostare il tempo di esecuzione:

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

Non sono sicuro del motivo per cui questo è stato votato negativamente, perché è l'unica cosa che ha funzionato per me.
pcalkins

1
Molto probabilmente è stato votato negativamente a causa dei valori hardcoded nel codice.
Kevin C.

Il più veloce da testare, ma non sono d'accordo su qualcosa che mi piacerebbe vedere come codice di check-in, a lungo termine.
Brett Rigby

sebbene questo sia hardcoded, lo considero il modo più semplice per farlo.
Andare-gone

1
Il mio metodo preferito, lo uso in combinazione con DEBUG per impostare il valore giusto.
Dave de Jong

6

Con l'ultima versione di dotnet cli (2.1.400 o superiore), puoi semplicemente impostare questa proprietà msbuild $(EnvironmentName)e gli strumenti di pubblicazione si occuperanno di aggiungere ASPNETCORE_ENVIRONMENT a web.config con il nome dell'ambiente.

Inoltre, il supporto XDT è disponibile a partire dalla 2.2.100-preview1.

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


7
Potresti approfondire you can just set this msbuild property $(EnvironmentName) and publisho fornire un riferimento?
DanElliott

1
come potrei impostarlo in un'app console .net core?
user441365

5
  1. Crea i tuoi file appsettings. *. Json. (Esempi: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. Aggiungi le tue variabili a quei file.

  3. Crea un profilo di pubblicazione separato per ogni ambiente, come faresti normalmente.

  4. Apri PublishProfiles / Development.pubxml (la denominazione sarà basata su ciò che hai chiamato Profilo di pubblicazione).

  5. Aggiungi semplicemente un tag a PublishProfile per impostare la variabile EnvironmentName , la convenzione di denominazione dei file appsettings. *. Json fa il resto.

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

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

Fare riferimento alla sezione "Impostazione dell'ambiente".


3

Questa variabile può essere salvata in json. Ad esempio envsettings.json con il contenuto come di seguito

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

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

Successivamente modifica il tuo program.cs come di seguito

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

In questo modo sarà sempre incluso nella pubblicazione e potrai modificare il valore richiesto in base all'ambiente in cui è ospitato il sito web. Questo metodo può essere utilizzato anche nell'app console poiché le modifiche si trovano in Program.cs


0

Ho trovato che funziona per me impostando questa variabile direttamente sulla piattaforma Azure (se la usi). Seleziona semplicemente la tua app web -> configurazione -> impostazioni dell'applicazione e aggiungi la variabile e il suo valore, quindi premi il pulsante Salva.


0

Un'altra opzione che utilizziamo nei nostri progetti per poter impostare l'ambiente per sito è aggiungere un file Parameters.xml al progetto con il seguente contenuto:

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

L'azione di compilazione per questo file è Contenuto e l'azione di copia è Copia se più recente, quindi farà parte del pacchetto da distribuire.

Quindi, per distribuire il pacchetto e impostare l'ambiente, nella versione, sotto l'attività "WinRM - Distribuzione di app Web IIS" (funziona altrettanto bene quando si utilizza l'attività "Distribuzione di app Web IIS"), impostiamo argomenti aggiuntivi per msdeploy :

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

In questo modo possiamo avere più versioni, tutte utilizzando lo stesso artefatto, ma distribuite come ambienti diversi.


0

So che questo è un vecchio post, ma ho pensato di inserire la mia semplice soluzione nel mix poiché nessuno l'ha suggerito.

Uso la directory corrente per determinare l'ambiente corrente, quindi capovolgo la stringa di connessione e la variabile di ambiente. Funziona alla grande finché hai una convenzione di denominazione per le cartelle del tuo sito come 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();
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.