bagaimana cara mengatur ASPNETCORE_ENVIRONMENT agar dipertimbangkan untuk menerbitkan aplikasi inti asp.net?

110

ketika saya mempublikasikan aplikasi web inti asp.net saya ke sistem file lokal saya, itu selalu membutuhkan produksi-config dan variabel ASPNETCORE_ENVIRONMENT dengan nilai = "Produksi".

bagaimana dan di mana saya harus menetapkan nilai variabel ASPNETCORE_ENVIRONMENT sehingga akan dianggap tidak hanya untuk debugging, tetapi juga untuk penerbitan ? saya sudah mencoba opsi berikut tanpa hasil:

  • dalam pengaturan windows
  • dalam file .pubxml
  • di launchSettings.json
  • di project.json
Dario
sumber
3
Apakah Anda membaca dokumen resmi docs.microsoft.com/en-us/aspnet/core/fundamentals/environments atau tutorial ini andrewlock.net/… ?
J. Doe
1
stackoverflow.com/questions/43493259/… ini memiliki 2 opsi untuk memeriksa kesalahan yang sebenarnya.
Kurkula

Jawaban:

91

Selain opsi yang disebutkan di atas, ada beberapa Solusi lain.

1. Memodifikasi file proyek (.CsProj) file

MSBuild mendukung EnvironmentNameProperti yang dapat membantu mengatur variabel lingkungan yang tepat sesuai Lingkungan yang ingin Anda Terapkan. Nama lingkungan akan ditambahkan di web.config selama fase Publikasikan.

Cukup buka file proyek (* .csProj) dan tambahkan XML berikut.

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

Kode di atas akan menambahkan nama lingkungan seperti Developmentuntuk konfigurasi Debug atau jika tidak ada konfigurasi yang ditentukan. Untuk Konfigurasi lainnya, nama Lingkungan akan ada Productiondi file web.config yang dihasilkan. Lebih lengkapnya di sini

2. Menambahkan Properti EnvironmentName di profil publikasikan.

Kami juga dapat menambahkan <EnvironmentName>properti di profil terbitkan. Buka file profil terbitkan yang terletak di Properties/PublishProfiles/{profilename.pubxml}Ini akan menetapkan nama Lingkungan di web.config ketika proyek diterbitkan. Lebih jelasnya di sini

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

3. Opsi baris perintah menggunakan dotnet publish

Selain itu, kita dapat meneruskan properti EnvironmentNamesebagai opsi baris perintah ke dotnet publishperintah. Perintah berikut akan menyertakan variabel lingkungan seperti Developmentpada file web.config.

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

Abhinav Galodha
sumber
8
Ini sepertinya jawaban terbaik sejauh yang saya tahu. Kemampuan untuk mengaturnya per profil publikasi sangat membantu saya.
Jonathan Quinth
Opsi ketiga berhasil untuk saya. Apakah Anda tahu jika / p: opsi EnvironmentName disebutkan di mana saja dalam dokumentasi dotnet?
rasyadi
8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentpersis seperti yang saya cari. Terima kasih!
Matt M
Bisakah Anda sebutkan secara lengkap 'dotnet publish ....' jika seseorang ingin mempublikasikan ke UAT, QA atau Production?
crazyTech
76

Pilihan 1:

Untuk mengatur variabel lingkungan ASPNETCORE_ENVIRONMENT di windows,

Garis komando - setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"

Untuk OS lain lihat ini - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

Pilihan 2:

Jika Anda ingin menyetel ASPNETCORE_ENVIRONMENT menggunakan web.configlalu tambahkan aspNetCoreseperti ini-

<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>
Sanket
sumber
43
Keduanya adalah pilihan yang buruk. 1) setel ini untuk seluruh OS, saya ingin itu per situs di IIS. 2) AspNet Core tidak mendukung transformasi web.config. Bagaimana Anda menyarankan web.config dimodifikasi untuk penyebaran?
Kugel
Lihat dokumentasi resmi di sini - docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket
5
Setelah Anda menemukan opsi yang lebih baik ... silakan berbagi di sini :)
Sanket
5
desain konfigurasi semacam ini nampaknya sangat berantakan.
koo9
2
Anda dapat mengganti ini di profil publikasikan untuk beberapa lingkungan.
cederlof
31

Cara sederhana untuk mengaturnya di IDE studio visual.

Proyek> Properti> Debug> Variabel lingkungan

masukkan deskripsi gambar di sini

Tandai Macneil Bikeio
sumber
3
Tapi kemudian Anda perlu mengingat mengubah ini setiap kali Anda perlu memublikasikan ke lingkungan yang berbeda.
Alisson
15
Itu tidak benar. Itu hanya berfungsi saat menjalankan IDE. Menyimpannya di file launchsettings.json yang merupakan Visual Studio. Tidak akan berfungsi untuk penerapan.
onefootswill
21

Anda harus mengikuti instruksi yang disediakan dalam dokumentasi , menggunakan 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>

Perhatikan bahwa Anda juga dapat menyetel variabel lingkungan lainnya.

Modul Inti ASP.NET memungkinkan Anda menentukan variabel lingkungan untuk proses yang ditentukan dalam atribut processPath dengan menentukannya dalam satu atau lebih elemen anak environmentVariable dari elemen kumpulan environmentVariables di bawah elemen aspNetCore. Variabel lingkungan yang ditetapkan di bagian ini lebih diutamakan daripada variabel lingkungan sistem untuk proses tersebut.

David Pine
sumber
bagaimana cara mengaturnya di aplikasi konsol inti .net?
pengguna441365
Atur mereka melalui dialog Variabel Lingkungan Windows.
David Pine
1
Tetapi apakah ada cara untuk mengaturnya dalam proyek daripada OS?
pengguna441365
Bukan untuk aplikasi konsol di .NET Core yang saya ketahui ... tidak - mungkin ini - stackoverflow.com/a/46445432/2410379 ?
David Pine
15

Beginilah cara kita mengatur waktu berjalan:

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();
}
Mightywill
sumber
tidak yakin mengapa ini ditolak, karena itu satu-satunya hal yang berhasil untuk saya.
pcalkins
1
Itu kemungkinan besar tidak disukai karena nilai hard-code dalam kode.
Kevin C.
Tercepat untuk menguji, tapi saya setuju bukan sesuatu yang saya ingin lihat sebagai kode check-in, jangka panjang.
Brett Rigby
meskipun ini adalah hardcode, saya melihat ini sebagai cara termudah untuk melakukan ini.
Hilang
1
Metode pilihan saya, saya menggunakannya dalam kombinasi dengan DEBUG untuk menetapkan nilai yang tepat.
Dave de Jong
7
  1. Buat pengaturan aplikasi Anda. *. File json. (Contoh: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. Tambahkan variabel Anda ke file tersebut.

  3. Buat profil terbitkan terpisah untuk setiap lingkungan, seperti yang biasa Anda lakukan.

  4. Buka PublishProfiles / Development.pubxml (penamaan akan didasarkan pada apa yang Anda beri nama Publish Profile).

  5. Cukup tambahkan tag ke PublishProfile untuk menyetel variabel EnvironmentName , selebihnya adalah konvensi penamaan file appsettings. *. Json.

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

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

Lihat bagian "Mengatur Lingkungan".

eliteproxy
sumber
6

Dengan versi terbaru dotnet cli (2.1.400 atau yang lebih baru), Anda cukup menyetel properti msbuild ini $(EnvironmentName) dan mempublikasikan perkakas akan menangani penambahan ASPNETCORE_ENVIRONMENT ke web.config dengan nama lingkungan.

Juga, dukungan XDT tersedia mulai 2.2.100-preview1.

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

vijayrkn
sumber
7
Bisakah Anda menjelaskan you can just set this msbuild property $(EnvironmentName) and publishatau memberikan referensi?
DanElliott
1
bagaimana cara mengaturnya di aplikasi konsol inti .net?
pengguna441365
3

Variabel ini dapat disimpan di json. Misalnya envsettings.json dengan konten seperti di bawah ini

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

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

Kemudian ubah program.cs Anda seperti di bawah ini

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

Dengan cara ini, itu akan selalu disertakan dalam publikasi dan Anda dapat mengubah nilai yang diperlukan sesuai dengan lingkungan tempat situs web dihosting. Metode ini juga dapat digunakan di aplikasi konsol karena perubahannya ada di Program.cs

Nagashree Hs
sumber
0

Saya menemukan itu berfungsi untuk saya dengan mengatur variabel ini langsung di Azure platorm (jika Anda menggunakannya). Cukup pilih aplikasi web Anda -> konfigurasi -> pengaturan aplikasi dan tambahkan variabel dan nilainya, lalu tekan tombol Simpan.

sinar
sumber
0

Opsi lain yang kami gunakan dalam proyek kami agar dapat mengatur lingkungan per situs adalah dengan menambahkan file Parameters.xml ke proyek dengan konten berikut:

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

Build Action untuk file ini adalah Content dan Copy Action adalah Copy If Newer sehingga itu akan menjadi bagian dari paket untuk disebarkan.

Kemudian, untuk menyebarkan paket dan mengatur lingkungan, dalam Rilis, di bawah tugas "WinRM - IIS Web App Deployment" (ini bekerja dengan baik saat menggunakan "IIS web app menyebarkan" tugas), kami menetapkan argumen tambahan untuk msdeploy :

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

Dengan cara ini kita dapat memiliki beberapa rilis, semua menggunakan artefak yang sama, tetapi diterapkan sebagai lingkungan yang berbeda.

Shahafo
sumber
0

Saya tahu ini adalah posting lama tetapi saya pikir saya akan memasukkan solusi sederhana saya ke dalam campuran karena tidak ada yang menyarankannya.

Saya menggunakan direktori saat ini untuk menentukan lingkungan saat ini kemudian membalik string koneksi dan variabel lingkungan. Ini berfungsi dengan baik selama Anda memiliki konvensi penamaan untuk folder situs Anda seperti 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();
    }
William Robinson
sumber