ASPNETCORE_ENVIRONMENT, bir asp.net çekirdek uygulamasını yayınlamak için dikkate alınacak şekilde nasıl ayarlanır?


118

asp.net çekirdek web uygulamamı yerel dosya sistemime yayınladığımda, her zaman production-config ve ASPNETCORE_ENVIRONMENT değişkenini = "Production" değeriyle birlikte alır.

ASPNETCORE_ENVIRONMENT değişkeninin değerini yalnızca hata ayıklama için değil, aynı zamanda yayınlama için de dikkate alınacak şekilde nasıl ve nerede ayarlamalıyım ? Aşağıdaki seçenekleri zaten başarılı olmadan denedim:

  • Windows ayarlarında
  • .pubxml dosyasında
  • launchSettings.json içinde
  • project.json içinde



1
stackoverflow.com/questions/43493259/… bunun gerçek hatayı kontrol etmek için 2 seçeneği vardır.
Kurkula

Yanıtlar:


96

Yukarıda belirtilen seçenekler dışında, birkaç başka Çözüm var.

1. Proje dosyası (.CsProj) dosyasını değiştirme

MSBuild, EnvironmentNameDağıtmak istediğiniz Ortama göre doğru ortam değişkenini ayarlamanıza yardımcı olabilecek Özelliği destekler . Ortam adı, Yayınlama aşaması sırasında web.config dosyasına eklenir.

Proje dosyasını (* .csProj) açın ve aşağıdaki XML'yi ekleyin.

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

Yukarıdaki kod, DevelopmentDebug yapılandırmasında olduğu gibi veya herhangi bir yapılandırma belirtilmemişse ortam adını ekleyecektir . Diğer herhangi bir Yapılandırma için Ortam adı Productionoluşturulan web.config dosyasında olacaktır. Daha fazla ayrıntı burada

2. Yayınlama profillerine EnvironmentName Özelliğini ekleme.

<EnvironmentName>Mülkü yayın profiline de ekleyebiliriz . İçinde bulunan yayınlama profili dosyasını açın Properties/PublishProfiles/{profilename.pubxml}Bu, proje yayınlandığında web.config'deki Ortam adını belirleyecektir. Daha fazla ayrıntı burada

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

3. dotnet publish kullanan komut satırı seçenekleri

Ek olarak, özelliği EnvironmentNamekomuta bir komut satırı seçeneği olarak iletebiliriz dotnet publish. Aşağıdaki komut Development, web.config dosyasındaki gibi ortam değişkenini içerecektir .

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


8
Bu söyleyebileceğim en iyi cevap gibi görünüyor. Bunu yayınlama profiline göre ayarlama yeteneği bana gerçekten çok yardımcı oldu.
Jonathan Quinth

1
Üçüncü seçenek benim için çalışıyor. / P: EnvironmentName seçeneğinin dotnet belgelerinde herhangi bir yerde belirtilip bahsedilmediğini biliyor musunuz?
rasyadi

9
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmenttam olarak aradığım şeydi. Teşekkürler!
Matt M

Birisi UAT, QA veya Prodüksiyona yayınlamak isterse, "dotnet publish ...." nin tam olarak ne olduğunu belirtebilir misiniz?
crazyTech

Ortamınız yayınladığınızda yeniden yüklenmezse, projeyi yeniden yükleyin.
cpoDesign

77

Seçenek 1:

Windows'ta ASPNETCORE_ENVIRONMENT ortam değişkenini ayarlamak için,

Komut satırı - setx ASPNETCORE_ENVIRONMENT "Development"

Güç kalkanı - $Env:ASPNETCORE_ENVIRONMENT = "Development"

Diğer işletim sistemleri için buna bakın - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environment

Seçenek 2:

Eğer ASPNETCORE_ENVIRONMENT kullanarak ayarlamak istiyorsanız web.configekleyin sonra aspNetCorebu- gibi

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

45
Bunların ikisi de korkunç seçenekler. 1) bunu tüm işletim sistemi için ayarlar, IIS'de her site için istiyorum. 2) AspNet Core, web.config dönüşümlerini desteklemez. Web.config'in dağıtım için değiştirilmesini nasıl önerirsiniz?
Kugel


5
Daha iyi bir seçenekle karşılaştığınızda ... lütfen burada paylaşın :)
Sanket

5
bu tür bir konfigürasyon tasarımı çok dağınık görünüyor.
koo9

2
Bunu birden çok ortam için yayınlama profillerinde geçersiz kılabilirsiniz.
cederlof

33

Bunu visual studio IDE'de ayarlamanın basit yolu.

Proje> Özellikler> Hata Ayıkla> Ortam değişkenleri

görüntü açıklamasını buraya girin


3
Ancak her seferinde farklı bir ortamda yayınlamanız gerektiğinde bunu değiştirmeyi hatırlamanız gerekir.
Alisson

15
Bu doğru değil. Bu yalnızca IDE çalıştırılırken çalışır. Bunu, bir Visual Studio şeyi olan launchsettings.json dosyasında saklar. Dağıtımlarda çalışmayacak.
onefoot11

21

Kullanarak belgelerde verilen talimatları izlemelisiniz 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>

Diğer ortam değişkenlerini de ayarlayabileceğinizi unutmayın.

ASP.NET Core Module, aspNetCore öğesi altındaki bir environmentVariables koleksiyon öğesinin bir veya daha fazla environmentVariable alt öğesinde bunları belirleyerek processPath özniteliğinde belirtilen işlem için ortam değişkenlerini belirtmenize olanak tanır. Bu bölümde ayarlanan ortam değişkenleri, işlem için sistem ortam değişkenlerine göre önceliklidir.


bunu bir .net çekirdek konsol uygulamasında nasıl ayarlarım?
user441365

Bunları Windows'un Ortam Değişkenleri iletişim kutusu aracılığıyla ayarlayın.
David Pine

1
Ancak bunu işletim sistemi yerine projede ayarlamanın bir yolu var mı?
user441365

Bildiğim .NET Core'daki konsol uygulamaları için değil ... hayır - belki bu - stackoverflow.com/a/46445432/2410379 ?
David Pine

17

Bunu çalışma zamanında şu şekilde ayarlayabiliriz:

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

Bunun neden reddedildiğinden emin değilim, çünkü benim için çalışan tek şey buydu.
pcalkins

1
Koddaki sabit kodlu değerler nedeniyle büyük olasılıkla reddedildi.
Kevin C.

Test etmesi en hızlı, ancak daha uzun vadede check-in kodu olarak görmek istediğim bir şeyi kabul etmiyorum.
Brett Rigby

bu kod gömülü olmasına rağmen, bunu yapmanın en kolay yolu olarak görüyorum.
Gitti

2
Tercih ettiğim yöntem, doğru değeri ayarlamak için DEBUG ile birlikte kullanıyorum.
Dave de Jong

8
  1. Appettings. * .Json dosyalarınızı oluşturun. (Örnekler: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. Değişkenlerinizi bu dosyalara ekleyin.

  3. Normalde yaptığınız gibi her ortam için ayrı bir yayın profili oluşturun.

  4. PublishProfiles / Development.pubxml dosyasını açın (adlandırma, Yayınlama Profili adını verdiğiniz şeye bağlı olacaktır).

  5. Basitçe etiket eklemek PublishProfile ayarlamak için EnvironmentName değişkeni appSettings. *. Json dosya adlandırma kuralı rest.

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

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

"Ortamı Ayarlama" bölümüne bakın.


6

Dotnet cli'nin en son sürümü (2.1.400 veya üstü) ile, bu msbuild özelliğini ayarlayabilir $(EnvironmentName)ve yayınlama araçları, ASPNETCORE_ENVIRONMENT'ı ortam adıyla web.config'e eklemeyi halledecektir.

Ayrıca, XDT desteği 2.2.100-önizleme1'den itibaren mevcuttur.

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


7
you can just set this msbuild property $(EnvironmentName) and publishBir referans verebilir misiniz ?
DanElliott

1
bunu bir .net çekirdek konsol uygulamasında nasıl ayarlarım?
user441365

4

Bu değişken json'a kaydedilebilir. Örneğin, aşağıdaki gibi içeriğe sahip 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"
  }

Daha sonra program.cs dosyanızı aşağıdaki gibi değiştirin

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

Bu şekilde her zaman yayına dahil edilecek ve web sitesinin barındırıldığı ortama göre gerekli değere değiştirebilirsiniz. Bu yöntem, değişiklikler Program.cs'de olduğu için konsol uygulamasında da kullanılabilir.


1

Bunun eski bir gönderi olduğunu biliyorum, ancak kimse önermediği için basit çözümümü karışıma dahil edeceğimi düşündüm.

Mevcut ortamı belirlemek için mevcut dizini kullanıyorum, ardından bağlantı dizesini ve ortam değişkenini çeviriyorum. Bu, site klasörleriniz için test / beta / sandbox gibi bir adlandırma kuralınız olduğu sürece harika çalışır.

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

0

Bu değişkeni doğrudan Azure platorm üzerinde ayarlayarak benim için çalıştığını buldum (kullanıyorsanız). Sadece web uygulamanızı -> konfigürasyon -> uygulama ayarlarını seçin ve değişkeni ve değerini ekleyin, ardından Kaydet düğmesine basın.


0

Siteye göre ortam ayarlayabilmek için projelerimizde kullandığımız diğer bir seçenek ise aşağıdaki içeriğe sahip bir Parameters.xml dosyasını projeye eklemektir:

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

Bu dosya için Derleme Eylemi İçerik ve Kopyalama Eylemi Yeniyse Kopyala olduğundan, dağıtılacak paketin bir parçası olacaktır.

Ardından, paketi dağıtmak ve ortamı ayarlamak için, Sürüm'de "WinRM - IIS Web Uygulaması Dağıtımı" görevi altında ("IIS web uygulaması dağıtımı" görevi kullanıldığında da aynı şekilde çalışır), msdeploy için ek bağımsız değişkenler belirleriz :

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

Bu şekilde, hepsi aynı yapıyı kullanan, ancak farklı ortamlar olarak dağıtılan birden fazla sürümümüz olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.