วิธีตั้งค่า ASPNETCORE_ENVIRONMENT ให้ได้รับการพิจารณาสำหรับการเผยแพร่แอปพลิเคชันหลักของ asp.net


121

เมื่อฉันเผยแพร่แอปพลิเคชันเว็บหลักของ asp.net ไปยังระบบไฟล์ภายในเครื่องจะใช้การกำหนดค่าการผลิตและตัวแปร ASPNETCORE_ENVIRONMENT ด้วยค่า = "การผลิต" เสมอ

และวิธีการที่ฉันจะต้องตั้งค่าของตัวแปร ASPNETCORE_ENVIRONMENT เพื่อที่มันจะได้รับการพิจารณาไม่เพียง แต่สำหรับการแก้จุดบกพร่อง แต่ยังสำหรับการเผยแพร่ ? ฉันลองตัวเลือกต่อไปนี้แล้ว แต่ไม่ประสบความสำเร็จ:

  • ในการตั้งค่า windows
  • ในไฟล์. pubxml
  • ใน launchSettings.json
  • ใน project.json

3
คุณอ่านอย่างเป็นทางการเอกสารdocs.microsoft.com/en-us/aspnet/core/fundamentals/environmentsหรือกวดวิชานี้andrewlock.net/... ?
J. Doe


1
stackoverflow.com/questions/43493259/…มี 2 ​​ตัวเลือกในการตรวจสอบข้อผิดพลาดจริง
Kurkula

คำตอบ:


97

นอกเหนือจากตัวเลือกที่กล่าวถึงข้างต้นแล้วยังมีโซลูชันอื่น ๆ อีกสองสามวิธี

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 ในโปรไฟล์การเผยแพร่

เราสามารถเพิ่ม<EnvironmentName>คุณสมบัติในโปรไฟล์การเผยแพร่ได้เช่นกัน เปิดไฟล์โพรไฟล์การเผยแพร่ซึ่งอยู่ที่ส่วนProperties/PublishProfiles/{profilename.pubxml}นี้จะตั้งชื่อสภาพแวดล้อมใน web.config เมื่อมีการเผยแพร่โครงการ รายละเอียดเพิ่มเติมที่นี่

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

3. ตัวเลือกบรรทัดคำสั่งโดยใช้ dotnet published

นอกจากนี้เราสามารถส่งคุณสมบัติEnvironmentNameเป็นตัวเลือกบรรทัดคำสั่งไปยังdotnet publishคำสั่ง คำสั่งต่อไปนี้จะรวมตัวแปรสภาพแวดล้อมเช่นเดียวกับDevelopmentในไฟล์ web.config

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


8
นี่เป็นคำตอบที่ดีที่สุดเท่าที่ฉันสามารถบอกได้ ความสามารถในการตั้งค่าต่อโปรไฟล์การเผยแพร่ช่วยฉันได้มากจริงๆ
Jonathan

2
ตัวเลือกที่สามเหมาะสำหรับฉัน คุณรู้หรือไม่ว่าตัวเลือก / p: EnvironmentName กล่าวถึงที่ใดก็ได้ในเอกสาร dotnet
rasyadi

9
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentคือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
Matt M

โปรดระบุว่า "dotnet published .... " ฉบับสมบูรณ์คืออะไรหากมีคนต้องการเผยแพร่ไปยัง UAT, QA หรือ Production
crazyTech

หากสภาพแวดล้อมของคุณไม่โหลดซ้ำเมื่อคุณเผยแพร่ให้โหลดโปรเจ็กต์ซ้ำ
cpoDesign

77

ตัวเลือกที่ 1:

ในการตั้งค่าตัวแปรสภาพแวดล้อม ASPNETCORE_ENVIRONMENT ใน windows

บรรทัดคำสั่ง - setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"

สำหรับระบบปฏิบัติการอื่นโปรดดูที่ - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environment

ตัวเลือกที่ 2:

หากคุณต้องการตั้ง ASPNETCORE_ENVIRONMENT ใช้web.configแล้วเพิ่มaspNetCoreเช่น 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>

47
ทั้งสองอย่างนี้เป็นตัวเลือกที่แย่มาก 1) ตั้งค่านี้สำหรับระบบปฏิบัติการทั้งหมดฉันต้องการต่อไซต์ใน IIS 2) AspNet Core ไม่รองรับการแปลง web.config คุณแนะนำว่า web.config ได้รับการแก้ไขเพื่อปรับใช้อย่างไร
Kugel

อ้างอิงเอกสารอย่างเป็นทางการที่นี่ - docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket

5
เมื่อคุณเจอตัวเลือกที่ดีกว่า ... โปรดแชร์ที่นี่ :)
Sanket

5
การออกแบบโครงแบบเหล่านี้ดูยุ่งมาก
koo9

2
คุณสามารถลบล้างสิ่งนี้ได้ในโปรไฟล์การเผยแพร่สำหรับหลายสภาพแวดล้อม
cederlof

36

วิธีง่ายๆในการตั้งค่าใน Visual Studio IDE

โครงการ> คุณสมบัติ> ดีบัก> ตัวแปรสภาพแวดล้อม

ป้อนคำอธิบายภาพที่นี่


3
แต่คุณต้องจำไว้ว่าการเปลี่ยนแปลงนี้ทุกครั้งที่คุณต้องเผยแพร่ไปยังสภาพแวดล้อมอื่น
Alisson

18
ไม่ถูกต้อง ใช้งานได้เมื่อเรียกใช้ IDE เท่านั้น เก็บไว้ในไฟล์ launchsettings.json ซึ่งเป็นสิ่งที่ Visual Studio ไม่สามารถใช้งานได้
onefootswill

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 Core Module ช่วยให้คุณระบุตัวแปรสภาพแวดล้อมสำหรับกระบวนการที่ระบุในแอ็ตทริบิวต์ processPath โดยการระบุอิลิเมนต์ย่อยของสภาวะแวดล้อมอย่างน้อยหนึ่งอิลิเมนต์ตัวแปรของ environmentVariables ภายใต้อิลิเมนต์ aspNetCore ตัวแปรสภาพแวดล้อมที่ตั้งค่าในส่วนนี้จะมีความสำคัญเหนือกว่าตัวแปรสภาพแวดล้อมระบบสำหรับกระบวนการ


ฉันจะตั้งค่าในแอปคอนโซล. net core ได้อย่างไร
user441365

ตั้งค่าผ่านกล่องโต้ตอบ Environment Variables ของ Windows
David Pine

1
แต่มีวิธีตั้งค่าในโครงการมากกว่า OS หรือไม่?
user441365

ไม่ใช่สำหรับแอปคอนโซลใน. NET Core ที่ฉันรู้ ... ไม่ - อาจเป็นเช่นนี้ - stackoverflow.com/a/46445432/2410379 ?
David Pine

17

นี่คือวิธีที่เราสามารถตั้งค่าได้ในรันไทม์:

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

ไม่แน่ใจว่าเหตุใดสิ่งนี้จึงถูกโหวตลงเพราะเป็นสิ่งเดียวที่เหมาะกับฉัน
pcalkins

1
มีแนวโน้มว่าจะถูกโหวตลดลงเนื่องจากค่าฮาร์ดโค้ดในโค้ด
Kevin C.

เร็วที่สุดในการทดสอบ แต่ฉันไม่เห็นด้วยกับสิ่งที่ฉันต้องการให้เป็นรหัสเช็คอินระยะยาว
Brett Rigby

แม้ว่าจะเป็นฮาร์ดโค้ด แต่ฉันเห็นว่านี่เป็นวิธีที่ง่ายที่สุดในการทำเช่นนี้
หายไป

2
วิธีที่ฉันชอบฉันใช้ร่วมกับ DEBUG เพื่อตั้งค่าที่เหมาะสม
Dave de Jong

10
  1. สร้าง appsettings. *. ไฟล์ json (ตัวอย่าง: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. เพิ่มตัวแปรของคุณลงในไฟล์เหล่านั้น

  3. สร้างโปรไฟล์การเผยแพร่แยกกันสำหรับแต่ละสภาพแวดล้อมเหมือนที่คุณทำตามปกติ

  4. เปิด PublishProfiles / Development.pubxml (การตั้งชื่อจะขึ้นอยู่กับสิ่งที่คุณตั้งชื่อโปรไฟล์เผยแพร่)

  5. เพียงแค่เพิ่มแท็กในPublishProfileเพื่อตั้งค่าตัวแปรEnvironmentNameหลักการตั้งชื่อไฟล์ appsettings. *. 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

โปรดดูส่วน“ ตั้งค่าสภาพแวดล้อม”


6

ด้วย dotnet cli เวอร์ชันล่าสุด (2.1.400 ขึ้นไป) คุณสามารถตั้งค่าคุณสมบัติ msbuild นี้ได้$(EnvironmentName)และการเผยแพร่เครื่องมือจะดูแลการเพิ่ม ASPNETCORE_ENVIRONMENT ไปยัง web.config ด้วยชื่อสภาพแวดล้อม

นอกจากนี้ยังรองรับ XDT ได้ตั้งแต่ 2.2.100-preview1

ตัวอย่าง: https://github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
คุณช่วยอธิบายอย่างละเอียดyou can just set this msbuild property $(EnvironmentName) and publishหรือให้ข้อมูลอ้างอิงได้ไหม
DanElliott

1
ฉันจะตั้งค่าในแอปคอนโซล. net core ได้อย่างไร
user441365

4

ตัวแปรนี้สามารถบันทึกใน 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();
     }
 }

วิธีนี้จะรวมอยู่ในการเผยแพร่เสมอและคุณสามารถเปลี่ยนเป็นค่าที่ต้องการได้ตามสภาพแวดล้อมที่โฮสต์เว็บไซต์ วิธีนี้สามารถใช้ในแอปคอนโซลได้เช่นกันเนื่องจากการเปลี่ยนแปลงอยู่ใน Program.cs


1

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คิดว่าฉันจะใช้วิธีง่ายๆของฉันในการผสมผสานเนื่องจากไม่มีใครแนะนำ

ฉันใช้ไดเร็กทอรีปัจจุบันเพื่อกำหนดสภาพแวดล้อมปัจจุบันจากนั้นพลิกสตริงการเชื่อมต่อและตัวแปรสภาพแวดล้อม วิธีนี้ใช้งานได้ดีตราบเท่าที่คุณมีรูปแบบการตั้งชื่อสำหรับโฟลเดอร์ไซต์ของคุณเช่น 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();
    }

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>

Build Action สำหรับไฟล์นี้คือContentและ Copy Action คือCopy If Newerดังนั้นมันจะเป็นส่วนหนึ่งของแพ็กเกจเพื่อปรับใช้

จากนั้นในการปรับใช้แพ็กเกจและตั้งค่าสภาพแวดล้อมใน Release ภายใต้งาน "WinRM - IIS Web App Deployment" (ทำงานได้ดีเช่นกันเมื่อใช้งาน "IIS web app deploy") เราตั้งค่าอาร์กิวเมนต์เพิ่มเติมสำหรับ msdeploy :

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

ด้วยวิธีนี้เราสามารถมีได้หลายรุ่นโดยทั้งหมดใช้อาร์ติแฟกต์เดียวกัน แต่ปรับใช้เป็นสภาพแวดล้อมที่ต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.