ASP.netCORE_ENVIRONMENT सेट करने के लिए एक asp.net कोर एप्लिकेशन को प्रकाशित करने के लिए कैसे विचार किया जाए?


105

जब मैं अपने asp.net कोर वेब एप्लिकेशन को अपने स्थानीय फ़ाइल सिस्टम में प्रकाशित करता हूं, तो यह हमेशा उत्पादन-कॉन्फ़िगरेशन और ASPNETCORE_ENVIRONMENT चर = "उत्पादन" के साथ लेता है।

मुझे कैसे और कहां ASPNETCORE_ENVIRONMENT चर का मान सेट करना है ताकि इसे न केवल डिबगिंग के लिए माना जाए, बल्कि प्रकाशन के लिए भी ? मैंने पहले ही सफलता के बिना निम्नलिखित विकल्पों की कोशिश की:

  • विंडोज़ सेटिंग्स में
  • .pubxml फ़ाइल में
  • in लॉन्चिंग
  • in प्रोजेक्ट। json

3
क्या आपने आधिकारिक डॉक्स डॉक्स.मेडिसिन.com/en - us/aspnet/core/fundamentals/en एन्वायरनमेंट या इस ट्यूटोरियल andrewlock.net/… को पढ़ा है ?
जे डो


1
stackoverflow.com/questions/43493259/… वास्तविक त्रुटि की जांच करने के लिए इसके 2 विकल्प हैं।
कुरकुला

जवाबों:


85

ऊपर वर्णित विकल्पों के अलावा, अन्य समाधानों के एक जोड़े हैं।

1. परियोजना फ़ाइल (.CsProj) फ़ाइल को संशोधित करना

MSBuild उस EnvironmentNameप्रॉपर्टी का समर्थन करता है जो आपके द्वारा परिनियोजित करने के लिए इच्छित वातावरण के अनुसार सही वातावरण चर सेट करने में मदद कर सकती है। प्रकाशित चरण के दौरान पर्यावरण का नाम web.config में जोड़ा जाएगा।

बस प्रोजेक्ट फ़ाइल खोलें (* .csProj) और निम्न 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>

उपरोक्त कोड Developmentडिबग कॉन्फ़िगरेशन के लिए या यदि कोई कॉन्फ़िगरेशन निर्दिष्ट नहीं है, तो पर्यावरण नाम जोड़ देगा । किसी भी अन्य कॉन्फ़िगरेशन के लिए पर्यावरण का नाम Productionउत्पन्न web.config फ़ाइल में होगा। अधिक जानकारी यहाँ

2. प्रकाशित प्रोफाइल में एन्वायरमेंटलनाम प्रॉपर्टी को जोड़ना।

हम <EnvironmentName>संपत्ति को प्रकाशित प्रोफ़ाइल में भी जोड़ सकते हैं । प्रकाशित प्रोफ़ाइल फ़ाइल खोलें, जो Properties/PublishProfiles/{profilename.pubxml}इस पर स्थित है जब प्रोजेक्ट प्रकाशित होने पर web.config में पर्यावरण नाम सेट होगा। अधिक विवरण यहाँ

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

3. डॉटनेट प्रकाशन का उपयोग करके कमांड लाइन विकल्प

अतिरिक्त, हम EnvironmentNameकमांड के विकल्प के रूप में संपत्ति को पास कर सकते हैं dotnet publish। निम्न आदेश Developmentमें web.config फ़ाइल की तरह पर्यावरण चर शामिल होगा ।

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


7
यह अब तक का सबसे अच्छा उत्तर जैसा लगता है जैसा कि मैं बता सकता हूं। प्रति प्रकाशित प्रोफ़ाइल में इसे सेट करने की क्षमता ने वास्तव में मुझे बहुत मदद की।
जोनाथन क्विथ

तीसरा विकल्प मेरे लिए काम करता है। क्या आप जानते हैं कि पी / पी: एनवायरनेट विकल्प डॉटनेट प्रलेखन में कहीं भी उल्लिखित है?
रासादि

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentवास्तव में मैं क्या देख रहा था। धन्यवाद!
मैट एम

क्या आप बता सकते हैं कि पूर्ण 'डॉटनेट प्रकाशित ....' क्या होगा यदि कोई यूएटी, क्यूए या उत्पादन में प्रकाशित करना चाहता था?
क्रेजी टेक

74

विकल्प 1:

खिड़कियों में ASPNETCORE_ENVIRONMENT पर्यावरण चर सेट करने के लिए,

कमांड लाइन - setx ASPNETCORE_ENVIRONMENT "Development"

शक्ति कोशिका - $Env:ASPNETCORE_ENVIRONMENT = "Development"

अन्य OS के लिए इसे देखें - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/en वातावरण

विकल्प 2:

यदि आप ASPNETCORE_ENVIRONMENT सेट करना चाहते हैं web.configतो aspNetCoreइस तरह जोड़ें-

<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
ये दोनों ही भयानक विकल्प हैं। 1) इसे पूरे OS के लिए सेट करता है, मैं इसे प्रति साइट IIS में पसंद करूंगा। 2) AspNet Core web.config ट्रांसफार्म का समर्थन नहीं करता है। आप कैसे सुझाव देते हैं कि web.config परिनियोजन के लिए संशोधित हो जाता है?
कुगेल

आधिकारिक दस्तावेज यहां देखें - docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket

5
एक बार जब आप बेहतर विकल्प में आ गए तो ... कृपया यहाँ शेयर करें :)
संचित

5
इस तरह के विन्यास डिजाइन बहुत गन्दा लगता है।
koo9

2
आप कई वातावरणों के लिए प्रकाशित प्रोफ़ाइल में इसे ओवरराइड कर सकते हैं।
cederlof

31

दृश्य स्टूडियो आईडीई में इसे सेट करने का सरल तरीका।

प्रोजेक्ट> गुण> डीबग> पर्यावरण चर

यहां छवि विवरण दर्ज करें


3
लेकिन फिर आपको यह याद रखने की आवश्यकता है कि हर बार आपको एक अलग वातावरण में प्रकाशित करने की आवश्यकता है।
एलिसन

15
यह सही नहीं है। वह केवल IDE चलाते समय काम करता है। इसे लॉन्चस्सेटिंग्स.जॉन फ़ाइल में संग्रहीत करता है जो एक विज़ुअल स्टूडियो चीज़ है। तैनाती के लिए काम नहीं करेंगे।
वनफुटस्विल

21

आपको दस्तावेज़ का उपयोग करके दिए गए निर्देशों का पालन करना चाहिए 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>

ध्यान दें कि आप अन्य पर्यावरण चर भी सेट कर सकते हैं।

ASP.NET कोर मॉड्यूल आपको एक या एक से अधिक परिवेश में चाइल्ड तत्वों को निर्दिष्ट करने की प्रक्रिया के लिए पर्यावरण चर को निर्दिष्ट करने की अनुमति देता है। इस खंड में सेट किए गए पर्यावरण चर प्रक्रिया के लिए सिस्टम पर्यावरण चर पर पूर्वता लेते हैं।


मैं इसे एक .net कोर कंसोल ऐप में कैसे सेट करूंगा?
user441365

उन्हें विंडोज के पर्यावरण चर डायलॉग के माध्यम से सेट करें।
डेविड पाइन

1
लेकिन क्या ओएस के बजाय प्रोजेक्ट में इसे सेट करने का कोई तरीका है?
user441365

.NET कोर में कंसोल एप्स के लिए नहीं जो मुझे पता है ... नहीं - शायद यह - stackoverflow.com/a/46445432/2464379 ?
डेविड पाइन

15

इस प्रकार हम रन-टाइम में सेट कर सकते हैं:

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

यह सुनिश्चित नहीं था कि यह मतदान क्यों किया गया था, क्योंकि यह मेरे लिए काम करने वाली एकमात्र चीज़ है।
पीसील्किन

1
कोड में हार्ड-कोडेड मूल्यों के कारण यह सबसे अधिक संभावना है कि इसे वोट-डाउन किया गया था।
केविन C.

परीक्षण करने के लिए सबसे तेज, लेकिन मैं सहमत नहीं हूं कि मैं कुछ चेक-इन कोड के रूप में देखना चाहता हूं, लंबे समय तक।
ब्रेट रिग्बी

हालांकि यह हार्डकोड है, मैं इसे ऐसा करने का सबसे आसान तरीका देखता हूं।
गोइंग-

1
मेरा पसंदीदा तरीका, मैं सही मूल्य निर्धारित करने के लिए DEBUG के साथ संयोजन में इसका उपयोग करता हूं।
डेव जोंग

6

Dotnet cli (2.1.400 या अधिक) के नवीनतम संस्करण के साथ, आप बस इस msbuild संपत्ति सेट कर सकते हैं $(EnvironmentName)और प्रकाशित टूलिंग में ASPNETCORE_ENVIRONMENT को वेब नाम के साथ जोड़ने का ध्यान रखा जाएगा। पर्यावरण नाम के साथ।

साथ ही, XDT सपोर्ट 2.2.100-प्रीव्यू 1 से शुरू होता है।

नमूना: https://github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
क्या आप इस बारे में विस्तार से बता सकते हैं you can just set this msbuild property $(EnvironmentName) and publishया एक संदर्भ प्रदान कर सकते हैं ?
डेनियलॉट

1
मैं इसे एक .net कोर कंसोल ऐप में कैसे सेट करूंगा?
user441365

5
  1. अपनी एप्लेटिंग बनाएँ। *। Json फाइलें। (उदाहरण: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. उन फ़ाइलों में अपने चर जोड़ें।

  3. प्रत्येक पर्यावरण के लिए एक अलग प्रकाशित प्रोफ़ाइल बनाएं, जैसे आप सामान्य रूप से करेंगे।

  4. ओपन पब्लिशप्रोफाइल्स / डेवलपमेंट.पब्लक्सएमएल (नामकरण जो आपने प्रकाशित प्रोफाइल का नाम दिया है) पर आधारित होगा।

  5. बस एनवायरनमेंट वैरिएबल, ऐपसेटिंग्स को सेट करने के लिए पब्लिशपॉफाइल में एक टैग जोड़ें । *। Json फाइल नेमिंग कन्वेंशन बाकी काम करता है।

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

संदर्भ: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

"पर्यावरण सेट करें" अनुभाग देखें।


3

इस चर को json में बचाया जा सकता है। उदाहरण के लिए 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"
  }

बाद में नीचे के रूप में अपने program.cs को संशोधित करें

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

इस तरह यह हमेशा प्रकाशित में शामिल किया जाएगा और आप वेबसाइट को होस्ट किए जाने वाले वातावरण के अनुसार आवश्यक मूल्य में बदल सकते हैं। इस विधि का उपयोग कंसोल ऐप में भी किया जा सकता है क्योंकि प्रोग्राम्स में परिवर्तन मौजूद हैं


0

मैंने पाया कि मेरे लिए यह चर सीधे Azure platorm पर सेट करके काम कर रहा है (यदि आप इसका उपयोग करते हैं)। बस अपने वेब ऐप -> कॉन्फ़िगरेशन -> एप्लिकेशन सेटिंग्स का चयन करें और चर और इसके मूल्य को जोड़ें, फिर सहेजें बटन दबाएं।


0

अन्य विकल्प जो हम अपनी परियोजनाओं में उपयोग करते हैं ताकि पर्यावरण को प्रति-साइट सेट करने में सक्षम हो सके, परियोजना के लिए Parameters.xml फ़ाइल को निम्न सामग्री के साथ जोड़ सकते हैं:

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

इस फ़ाइल के लिए बिल्ड एक्शन कंटेंट है और कॉपी एक्शन कॉपी इफ़ेक्टर है तो यह तैनाती के लिए पैकेज का हिस्सा होगा।

फिर, पैकेज को लागू करने और पर्यावरण को सेट करने के लिए, रिलीज़ में, "WinRM - IIS वेब ऐप परिनियोजन" कार्य के तहत (यह "IIS वेब ऐप परिनियोजित" कार्य का उपयोग करते समय ठीक काम करता है), हम msdeploy के लिए अतिरिक्त तर्क सेट करते हैं :

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

इस तरह से हम एक ही विरूपण साक्ष्य का उपयोग करते हुए कई रिलीज कर सकते हैं, लेकिन विभिन्न वातावरणों के रूप में तैनात हैं।


0

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन मैंने सोचा कि मैं अपने सरल समाधान को मिश्रण में फेंक दूंगा क्योंकि किसी ने भी इसका सुझाव नहीं दिया है।

मैं वर्तमान परिवेश का निर्धारण करने के लिए वर्तमान निर्देशिका का उपयोग करता हूं फिर कनेक्शन स्ट्रिंग और पर्यावरण चर को फ्लिप करता हूं। यह तब तक बहुत अच्छा काम करता है जब तक कि आप अपने साइट फ़ोल्डर जैसे कि टेस्ट / बीटा / सैंडबॉक्स के लिए नामकरण सम्मेलन न करें।

    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();
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.