Aspnetcore: VS์—์„œ AspNetCore ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ web.config ๋ณ€ํ™˜ ์‚ฌ์šฉ

์— ๋งŒ๋“  2017๋…„ 05์›” 01์ผ  ยท  91์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/aspnetcore

๋‚˜๋Š” web.config์˜ ํŒฌ์ด ์•„๋‹ˆ์ง€๋งŒ IIS์— AspNetCore ์•ฑ์„ ๊ฒŒ์‹œํ•œ ๊ฒฝํ—˜์ด ์ •๋ง ์ข‹์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๋ฉด์„œ ์ด ๋ง์„ ์ ‘๋‘์‚ฌ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

AspNetCore์˜ ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์„ ๋กœ๋“œํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ASPNETCORE_ENVIRONMENT ๋ณ€์ˆ˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ๋ฐฐํฌ์— ๋Œ€ํ•ด ์ด ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์•…๋ชฝ์ด๋ฉฐ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋งŽ์€ ํ˜ผ๋ž€์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ 2๊ฐ€์ง€ ๋ฌธ์ œ๋กœ ์š”์•ฝ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” web.config ๋ณ€ํ™˜์€ VS์˜ ASP.NET Core ํ”„๋กœ์ ํŠธ์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
2) ASPNETCORE_ENVIRONMENT๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์œ ์ผํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์€ web.config๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ „์—ญ ASPNETCORE_ENVIRONMENT๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ผ ์„œ๋ฒ„์˜ ๋ชจ๋“  ์‚ฌ์ดํŠธ์— ๋Œ€ํ•ด ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. web.config๋Š” ์ž์ฒด ํฌํ•จ๋œ ๊ตฌ์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์—ญ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์€ IIS ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด๋กœ AspNetCore๋กœ ์ „ํ™˜ํ•˜๋Š” ๋‚˜์™€ ๊ฐ™์€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹จ๊ณ„๋ณ„๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— IIS ๊ฒŒ์‹œ ์Šคํ† ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ์ด์•ผ๊ธฐ๋Š” ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ณ  ์™„์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

web.config ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ˆ: https://github.com/aspnet/Home/issues/1701#issuecomment -298273962

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฒซ๊ธ€์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์„ค๊ณ„์ƒ ๋งค์šฐ ์œ ์—ฐํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์ž๋™ํ™”ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ IIS์— ๊ฒŒ์‹œํ•˜๋Š” ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋” ๊ฒŒ์‹œ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ IIS์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ web.config์—์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒŒ์‹œํ•˜๋Š” ๋™์•ˆ ํ”„๋กœ๋•์…˜ ๋˜๋Š” ๋ฌด์—‡์ด๋“  ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฝค ํ”ํ•œ ์ž‘์—…์ธ ๊ฒƒ ๊ฐ™์•„์š”. ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ? ์›๊ฒฉ ์„œ๋ฒ„์—์„œ web.config๋ฅผ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ ์„ค์ • ํ™˜๊ฒฝ์€ "dotnet publish"(๋ชจ๋“  ๊ฒŒ์‹œ ๋Œ€์ƒ์— ๋Œ€ํ•ด)๋ฅผ ํ†ตํ•ด ์ง€์›๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

dotnet publish ... -environment=Production

dotnet publish ๋Š” web.%Enviroment%.config (Web.Production.config, Web.Development.config) ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ web.config์™€ ๋ณ‘ํ•ฉ(๋ณ€ํ™˜)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ASPNETCORE_ENVIRONMENT์˜ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="value passed to publish" />
    </environmentVariables>         

๋ชจ๋“  91 ๋Œ“๊ธ€

FWIW, ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. IIS ์„ค์ •์„ ์œ„ํ•œ ๊ฒƒ์ž„์„ ๋ถ„๋ช…ํžˆ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ํ…œํ”Œ๋ฆฟ์— ๊ธฐ๋ณธ web.config ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

/cc @sayedihashimi

์ด๊ฒƒ์€ IIS์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๊นŒ? ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ASPNETCORE_ENVIRONMENT ๋ณ€์ˆ˜ fullstop์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์–ด๋–ค ํ™˜๊ฒฝ์— ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฝค ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹ค์–‘ํ•œ ์Šคํ…Œ์ด์ง•/QA ํ™˜๊ฒฝ์ด ๋™์ผํ•œ IIS ์ธ์Šคํ„ด์Šค์˜ ๋™์ผํ•œ ์ƒ์ž์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด "ํ™˜๊ฒฝ"์„ ๊ฐ€์ง„ 3๊ฐœ์˜ ํŒ€์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ(์˜ˆ: ํŠน์ • ๋ถ„๊ธฐ ๋ฐฐํฌ) ๋ชจ๋‘ ๋™์ผํ•œ ์ƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ๋ณ„๋กœ appsettings.json์ด ์ „ํ™˜๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ทจํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); }
์œ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IIS, nginix ๋“ฑ์ด ๊ทธ ์•ž์— ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌ์„ฑ ์Šค์™€ํ•‘์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์œ„์˜ ๋‚ด์šฉ์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณด์•˜์„ ๋•Œ Docker๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Puppet/Chef์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ ์„ค์ •์„ ๊ด€๋ฆฌํ•˜์—ฌ appsettings.{env}.json์ด ์—†๋Š” ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ MVC๋Š” ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@mindingdata Program.cs ํ™˜๊ฒฝ์˜ ์ถœ์ฒ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ์‹ค์ œ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๊ทธ๊ฒƒ์„ ์„ ์–ธํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค(์ฃผ์š” ๋ฐฉ๋ฒ•). ๋งค์ง ํŒŒ์ผ์ด๋‚˜ ์‹œ๊ฐ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด WebHostBuidler UseEnvironment(environmentName) ๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด ์ด๊ฒƒ์€ ์ „์ ์œผ๋กœ IIS ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ฑ ์„ค์ •์„ ์œ„ํ•œ ํ˜„์žฌ JSON ๊ตฌ์„ฑ ์‹œ์Šคํ…œ์€ ์ƒ๋‹นํžˆ ์ข‹์œผ๋ฉฐ ์™„์ „ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒํ•˜๋ ค๋ฉด web.config๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ์„ค์ •์„ ์žฌ์ •์˜ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋‹จ์ˆœํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ์„ค์ •์ด "๊ฐœ๋ฐœ"๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  web.config(์•„๋ž˜ ์ฐธ์กฐ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "ํ”„๋กœ๋•์…˜"์œผ๋กœ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ์ „ํžˆ ๊ฐœ๋ฐœ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (IIS์—์„œ ์‹คํ–‰๋˜๋Š” ASP.NET Core ์•ฑ).

<environmentVariables>
      <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
</environmentVariables>

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์žฅ์†Œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. N ๊ณ„์ธต ๋ฐ๋ชจ๋ฅผ ๋นŒ๋“œํ–ˆ๋Š”๋ฐ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต ํ”„๋กœ์ ํŠธ์— IHostingEnvironment๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ํ”„๋กœ์ ํŠธ๋Š” ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ณณ์ด๋ฉฐ ํ•ด๋‹น ๊ณ„์ธต์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์„ ์–ป๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋งˆ๋ฒ• ๋ฌธ์ž์—ด๋กœ OnConfiguring ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์Šฌ๋กœ์šฐ์น˜ํƒ€๋„ ๋ดค๋Š”๋ฐ VS ๋ฐฉ์‹์„ ์“ฐ๋Š๋ƒ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์“ฐ๋Š๋ƒ์— ๋”ฐ๋ผ ํ˜„์žฌ์˜ "๋””๋ฒ„๊ทธ, ๋ฆด๋ฆฌ์Šค" ๋˜๋Š” "๊ฐœ๋ฐœ, ์ƒ์‚ฐ" ๋ฐฉ์‹์„ ๋Œ์•„๋‹ค๋‹ˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. MS๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹จ์ผ ๊ณ„์ธต ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
           var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json");

            var config = builder.Build();
            var connstr = config.GetConnectionString("connStr");            
            optionsBuilder.UseSqlServer(connstr);
        }

๊ทธ๋ž˜์„œ ์ด์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

๋งˆ๋ฒ•์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์•ฑ ๊ตฌ์„ฑ์—์„œ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ค ์ €๋„ ์ด ๋ถ€๋ถ„์— ์ง„์ „์ด ์žˆ์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ƒ์ž์— ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฝค ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ appsettings.json ํŒŒ์ผ์—์„œ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ActiveEnvironment": "Development"
}

๊ทธ๋Ÿฐ ๋‹ค์Œ Program.CS์—์„œ IConfiguration์„ ๋นŒ๋“œํ•˜๊ณ  ํ™˜๊ฒฝ๋ณ„ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ธฐ ์ „์— ํ™˜๊ฒฝ ์ด๋ฆ„์„ 'ActiveEnvironment' ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

public static void Main(string[] args)
{
    WebHost.CreateDefaultBuilder()
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        // Get the environment from our hostContext.
        var env = hostingContext.HostingEnvironment;
        config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

        // Build an initial configuration.
        IConfiguration Configuration = config.Build();

        // Set the environment name.
        env.EnvironmentName = Configuration.GetSection("ActiveEnvironment").Value;

        // Load the configuration file for our specific environment.
        config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
        .AddEnvironmentVariables();
    })
    .UseStartup<Startup>()
    .Build()
    .Run();
}

๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์— ๊ฒŒ์‹œํ•  ๋•Œ 'ActiveEnvironment'๋„ ๊ทธ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@DaleMckeown ๋น„์Šทํ•œ ์ผ์„ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Microsoft.AspNetCore.WebHost๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์›น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—†๋Š” ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฌ์ „ํžˆ ์ ์šฉ๋ฉ๋‹ˆ๊นŒ?

@Swazimodo ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์ด ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋นŒ๋“œ ์—์ด์ „ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋ฃจํŠธ ์„ค์ • ํŒŒ์ผ์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์œผ๋กœ. ๋นŒ๋“œ๋Š” ๊ฐ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ zip ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

2017๋…„ 10์›” 26์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 12์‹œ 48๋ถ„, Dale Mckeown ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

@Swazimodo https://github.com/swazimodo ์ด ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค
int ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ปจํ…์ŠคํŠธ์ด๋ฏ€๋กœ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€
ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/aspnet/Home/issues/2019#issuecomment-339728441 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AAx4bT20JSb0XSzNBIAiiubq9mTVKbW5ks5swLf6gaJpZM4NMx25
.

๋ชจ๋“  ์†”๋ฃจ์…˜์— ์ผ์ข…์˜ ํฌ์ŠคํŠธ ๋นŒ๋“œ/๊ฒŒ์‹œ ์กฐ์ •์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๊ฒฐ๊ตญ ์•ฑ ๋ฃจํŠธ์— ๋นˆ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  ์ด๋ฅผ ํ™˜๊ฒฝ์œผ๋กœ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์นœ ๊ฒŒ ์žˆ๋‹ˆ?

์ฒซ๊ธ€์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์„ค๊ณ„์ƒ ๋งค์šฐ ์œ ์—ฐํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์ž๋™ํ™”ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ IIS์— ๊ฒŒ์‹œํ•˜๋Š” ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋” ๊ฒŒ์‹œ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ IIS์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ web.config์—์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒŒ์‹œํ•˜๋Š” ๋™์•ˆ ํ”„๋กœ๋•์…˜ ๋˜๋Š” ๋ฌด์—‡์ด๋“  ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฝค ํ”ํ•œ ์ž‘์—…์ธ ๊ฒƒ ๊ฐ™์•„์š”. ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์ฃ ? ์›๊ฒฉ ์„œ๋ฒ„์—์„œ web.config๋ฅผ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ ์„ค์ • ํ™˜๊ฒฝ์€ "dotnet publish"(๋ชจ๋“  ๊ฒŒ์‹œ ๋Œ€์ƒ์— ๋Œ€ํ•ด)๋ฅผ ํ†ตํ•ด ์ง€์›๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

dotnet publish ... -environment=Production

dotnet publish ๋Š” web.%Enviroment%.config (Web.Production.config, Web.Development.config) ํŒŒ์ผ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ web.config์™€ ๋ณ‘ํ•ฉ(๋ณ€ํ™˜)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ASPNETCORE_ENVIRONMENT์˜ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="value passed to publish" />
    </environmentVariables>         

@evil-shrike๋Š” ๋นŒ๋“œ/๊ฒŒ์‹œ ์‹œ๊ฐ„ ๊ตฌ์„ฑ ๋ณ€ํ™˜์— ๋Œ€ํ•ด https://github.com/nil4/dotnet-transform-xdt ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

์•„๋งˆ๋„ ์œ ์Šค ์ผ€์ด์Šค. ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰๊ธฐ๊ฐ€ .\App_Data ์•„๋ž˜์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–์ง€๋งŒ .\ ์•„๋ž˜์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— .\App_Data ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์›น ๋ฐฐํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ App_Data ์•„๋ž˜์˜ ๋กœ๊ทธ ํด๋”์™€ ํ•จ๊ป˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ web.config๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๏ปฟ<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\<assembly>.exe" stdoutLogEnabled="true" stdoutLogFile=".\App_Data\logs\stdout" />
  </system.webServer>
</configuration>

์ด๋Ÿฌํ•œ ์„ค์ •์„ web.release.config ๋Œ€์‹  web.config ํŒŒ์ผ์— ๋„ฃ๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? processPath=".\<executable>.exe" ๋Š” IIS Express์— ๋Œ€ํ•ด ๋กœ์ปฌ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ์‹คํ–‰ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ข‹์€ "HTTP ์˜ค๋ฅ˜ 502.5 - ํ”„๋กœ์„ธ์Šค ์‹คํŒจ" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Jenkins๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ  NetFramework ํ”„๋กœ์ ํŠธ์—์„œ ํ™˜๊ฒฝ๋ณ„๋กœ vars ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ์กด ๋ฐฉ๋ฒ•์€ web.config ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ท๋„ท์—์„œ๋„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

msbuild ๋Š” web.config ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด aspnet core csproj์™€ ์—ฌ์ „ํžˆ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค!

Asp.Net Core csproj์— TransformXml ๊ฒŒ์‹œ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

ํŠน์ • ๋ณ€ํ™˜ ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<Target Name="ConfigDev">
    <TransformXml Source="web.config" Transform="web.dev.config" Destination="web.config" /></Target>

์˜ˆ๋ฅผ ๋“ค์–ด web.dev.config ์˜ ASPNETCORE_ENVIRONMENT ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

<system.webServer>
    <aspNetCore processPath="dotnet" arguments=".\Test.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" >
      <environmentVariables>
        <environmentVariable xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" value="dev" xdt:Transform="SetAttributes" />
      </environmentVariables>
    </aspNetCore>
</system.webServer>

๊ฒŒ์‹œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— msbuild ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ web.config๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

msbuild Test.csproj /t:ConfigDev

"๋‚˜๋Š” web.config์˜ ํŒฌ์ด ์•„๋‹ˆ์ง€๋งŒ IIS์— AspNetCore ์•ฑ์„ ๊ฒŒ์‹œํ•œ ๊ฒฝํ—˜์€ ์ •๋ง ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค."

๋‚˜๋Š” ์ด ์Šค๋ ˆ๋“œ์— ๋” ๋™์˜ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์ผ๋ฐ˜ ASP.Net์—์„œ ๊ตฌ์„ฑ ๋ณ€ํ™˜์˜ ๋‹จ์ˆœ์„ฑ ์ดํ›„์— ์‹œ์Šคํ…œ ์ „์ฒด์˜ ASPNETCORE_ENVIRONMENT ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ด ์ „์ฒด ์ข…์†์„ฑ์€ ์•…์ทจ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

Microsoft์˜ ์ž์ฒด ์˜ˆ์ œ์—์„œ๋„ ์ด ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด _appsettings.Production.json_ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค...

            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

...ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๊ตฌ์„ฑ์˜ NAME์—๋Š” ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๋•์…˜ ๊ตฌ์„ฑ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ์—๋„ ์—ฌ์ „ํžˆ appsettings.development.json์„ ์—ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋‹ˆ์š”, ๋‹ค๋ฅธ ํ™˜๊ฒฝ์— ๊ฒŒ์‹œํ•  ๋•Œ๋งˆ๋‹ค ASPNETCORE_ENVIRONMENT ๋ณ€์ˆ˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋ฌธ์ œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง _appsettings.XXXX.json_ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ์˜ˆ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด ๋ฌผ๊ฑด์ด ๋งˆ์นจ๋‚ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†๋‹ค. (ํ•œ์ˆจ์„ ์‰ฌ๋‹ค...)

๋„ค, ๊ณ ์ณ์ฃผ์„ธ์š” !!

๋ฐฉ๊ธˆ ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ๋•์…˜ dotnet ์ฝ”์–ด ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ–ˆ์œผ๋ฉฐ ์ด์ œ ์•ฑ์„ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ์ƒ์ž์— ๋‚ด ์•ฑ์„ ๊ฒŒ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ์„œ๋ฒ„์— ์Šคํ…Œ์ด์ง• ์ธ์Šคํ„ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์‚ฐ ์„ค์ •.

์ง€๊ธˆ์€ @DaleMckeown ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•ด ๋ณผ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์†”๋ฃจ์…˜์ด ์•„๋‹ˆ๋ผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์„œ๋ฒ„ ๋Œ€ ํ™˜๊ฒฝ์˜ ๋น„์œจ์ด 1:1์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น๋˜๋ฉฐ ๊ธฐ์—… ์™ธ๋ถ€์—์„œ๋Š” ๊ทธ๋Ÿฐ ์ผ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@willapp ๋‚ด ์ œ์•ˆ์€ ํ™•์‹คํžˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋™์•ˆ ๋™์ผํ•œ ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ์•ฑ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ์‹คํ–‰ํ–ˆ์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— 'ActiveEnvironment' ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” dkent600์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

<environmentVariables>
      <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
</environmentVariables>

ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ "appsettings.Development.json" ๊ฐ’์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ถ๊ทน์ ์œผ๋กœ ๊ฒŒ์‹œํ•  ๋•Œ xml ๋ณ€ํ™˜์˜ ์ด์ ์ด ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

DaleMckeown์ด ์ œ์•ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ASPNETCORE_ENVIRONMENT๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์œ ์ผํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์€ web.config๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ค๋งˆ. ๋™์ผํ•œ ์‹œ์Šคํ…œ์—์„œ ๋™์ผํ•œ ์‚ฌ์ดํŠธ์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ›จ์”ฌ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งˆ์ด์ฝ”์–ด์‚ฌ์ดํŠธ

    • ํฐ ์ƒ์ž

    • ๋กœ๊ทธ

  • env.๋ฌด์—‡์ด๋“ 

IIS ์•ฑ์ด bin ๋ฐ program.cs๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

.UseEnvironment(ReadEnvExtensionFromParentFolder())

๊ทธ๊ฒŒ ๋‹ค์•ผ ์›ํ•˜๋Š” ๋งŒํผ ์‚ฌ์ดํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๋ณ€ํ™˜์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด bin์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ env.Whenver์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ํ™˜๊ฒฝ์„ ์ „ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฐฌ์„ฑํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์— ๋Œ€ํ•ด URL ์žฌ์ž‘์„ฑ์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ์— ์ ํ•ฉํ•œ web.config ํŒŒ์ผ์„ ์„ ํƒํ•˜๋Š” ๊ฒŒ์‹œ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ดˆ๊ธฐ ๋ณด๊ณ ์„œ ์ดํ›„ 13๊ฐœ์›”์ด ์ง€๋‚ฌ๊ณ  ํ˜„์žฌ 2.1.0์ด ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ ๊ธฐ์กด IIS ํ˜ธ์ŠคํŒ…์—์„œ๋Š” ์—ฌ์ „ํžˆ ์ƒํ™ฉ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Azure๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ํ˜„์žฌ ๋‚ด๊ฐ€ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์‚ฌ์ดํŠธ์˜ ๋งŽ์€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ธฐ์กด IIS ํ˜ธ์ŠคํŒ…์˜ ๊ฒฝ์šฐ ๋ช…๋ น์ค„(์œ„์—์„œ @evil-shrike๊ฐ€ ์„ค๋ช…ํ•œ ๋Œ€๋กœ)๊ณผ ๋ชจ๋“  .pubxml ๊ฒŒ์‹œ ํ”„๋กœํ•„ ๋‚ด์—์„œ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @davidfowl์ด ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์ด web.config ๋ฐ IIS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด๋Š” ์—ฌ์ „ํžˆ ์„ค์น˜ ๊ธฐ๋ฐ˜์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

ํ˜„์žฌ Microsoft.DotNet.Xdt.Tools ๋ฐ web.config ๋ฒˆ์—ญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ์ทจ์•ฝํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ๋ณ„ ๋นŒ๋“œ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋ฉฐ v2.1.0์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ๋ฐฉ๊ธˆ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ถ„์•ผ์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋–ค ๊ณ„ํš์ด ์žˆ๋Š”์ง€ ๋“ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณ„ํš์ด ์—†๊ฑฐ๋‚˜ ๋จผ ์ผ์ด๋ผ๋ฉด ํ˜„์žฌ ๊ฐ•์ œ๋กœ ์ฑ„ํƒํ•ด์•ผ ํ•˜๋Š” ๋ถ€์„œ์ง€๊ธฐ ์‰ฌ์šด/๋ฐ˜์ˆ˜๋™ ๋ฐฉ์‹๋ณด๋‹ค ๋” ๋‚˜์€ ์ž„์‹œ ์†”๋ฃจ์…˜์ด ๋ถ„๋ช…ํžˆ ์žˆ์„๊นŒ์š”? ํŠนํžˆ QA ๋ฐฐํฌ ๋ฐ ์Šคํ…Œ์ด์ง•์˜ ๊ฒฝ์šฐ VS์—์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ํ—ค๋“œ ์ง€์‹๊ณผ ์ˆ˜๋™ ํ”„๋กœ์„ธ์Šค์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ์ •๋ง ์›ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ณ„ํš์€ ์—†์ง€๋งŒ @nil4์˜ https://github.com/nil4/xdt-samples/ ๋„๊ตฌ๋Š” ๊ฝค ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

@svallis ํ•ด๋ดค์–ด?

์‚ฌ๋žŒ๋“ค์ด ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@davidfowl ์˜ˆ, ํ˜„์žฌ ์†”๋ฃจ์…˜์€ ์—ฐ๊ฒฐํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ฒŒ์‹œํ•  ๋Œ€์ƒ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ํ™˜๊ฒฝ๋ณ„ ๋นŒ๋“œ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. csproj ์„ค์ •์—์„œ ๋ž˜์น˜ํ•  ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ€์ง€๋ ค๋ฉด ๋‹ค๋ฅธ ๋นŒ๋“œ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋ฉฐ ์ œ ๋ชฉ์ ์„ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ™˜๊ฒฝ๊ณผ์˜ 1:1 ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • ๋นŒ๋“œ ๊ตฌ์„ฑ: ๋””๋ฒ„๊ทธ = ํ™˜๊ฒฝ: ๊ฐœ๋ฐœ
  • ๋นŒ๋“œ ๊ตฌ์„ฑ: ์Šคํ…Œ์ด์ง• = ํ™˜๊ฒฝ: ์Šคํ…Œ์ด์ง•
  • ๋นŒ๋“œ ๊ตฌ์„ฑ: ๋ฆด๋ฆฌ์Šค = ํ™˜๊ฒฝ: ํ”„๋กœ๋•์…˜

ํ›„์ž์˜ ๊ฒฝ์šฐ ํ•ด๋‹น web.{Build configuration}.config ๋ฐ appsettings.{Environment}.json ๊ฐ€ ์žˆ๊ณ  web.{Build configuration}.config ๋Š” ๋ง ๊ทธ๋Œ€๋กœ web.config ์— ์ ์ ˆํ•œ ASPNETCORE_ENVIRONMENT ํ™˜๊ฒฝ ๋ณ€์ˆ˜. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์˜ˆ๋ฅผ ๊ณ„์†ํ•˜๋ฉด web.Release.config ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <aspNetCore>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ชจ๋‘ ๋ช…๋ น์ค„์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. dotnet publish -c Staging ๋˜๋Š” ๋ฌด์—‡์ด๋“  ์‹คํ–‰ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์ถœ๋ ฅ์ด ์žˆ๋Š” ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ web.config ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. dotnet publish ์— -iisenvironment ์Šค์œ„์น˜๊ฐ€ ์žˆ์–ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ VS ๊ฒŒ์‹œ์—์„œ ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ์ƒ์ž๋กœ ๋…ธ์ถœ๋˜๋ฉด ๋นŒ๋“œ ๊ตฌ์„ฑ, XDT, ๋“ฑ ๊ธฐ์กด IIS ํ˜ธ์ŠคํŒ… ์ƒํ™ฉ์—์„œ ์ˆ˜๋™์œผ๋กœ.

ํ•˜์ง€๋งŒ VS ๋‚ด์—์„œ ํ˜„์žฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ VS ๋‚ด์—์„œ ๊ฒŒ์‹œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ v2.0.0์—์„œ ์ž‘๋™ํ•˜๋”๋ผ๋„ ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— ์˜ฌ๋ฐ”๋ฅธ ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@davidfowl ๋‚ด ๊ด€์ ์—์„œ ์ด์ƒ์ ์œผ๋กœ๋Š” Web Deploy๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ™˜๊ฒฝ์„ ๊ฒŒ์‹œ ํ”„๋กœํ•„์˜ ์ผ๋ถ€๋กœ ์„ค์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, ์ถœํŒ ์˜ต์…˜์ด ์ด์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์ด ์•„๋‹Œ VS IDE๋ฅผ ํ†ตํ•ด ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋ฏ€๋กœ @svallis ์—์„œ ์„ค๋ช…ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ

@willapp ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜์€ Visual Studio์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ VS(https://github.com/aspnet/Home/issues/3190)์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ธ ์†”๋ฃจ์…˜์— ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. . ์ œ๊ฐ€ ๋ช…ํ™•ํžˆ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. csproj ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์„ค์ •์ด ์ด๋ฃจ์–ด์ง€๋ฉฐ ๋ช…๋ น์ค„๊ณผ VS๊ฐ€ ๋ชจ๋‘ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์นจ๋‚ด @davidfowl์ด ์œ„์—์„œ ์ œ์•ˆํ•œ ๋„๊ตฌ๋ฅผ ์‹œ๋„ํ–ˆ๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘

"ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ๋„๊ตฌ" ์„น์…˜ ์•„๋ž˜ https://github.com/nil4/dotnet-transform-xdt ์˜ ์ง€์นจ์„ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค(์•„์ง 2.1.0์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—). ๊ธฐ๋ณธ Web.config๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฐฐํฌํ•  ๋•Œ VS์—์„œ ์ƒ์„ฑํ•œ ๊ฒƒ์—์„œ ๋ณต์‚ฌ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ASPNETCORE_ENVIRONMENT๋ฅผ Development๋กœ ์„ค์ •ํ•˜๋Š” ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ Web.Debug.config๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์Šคํ†  ์•…์žฅ! ๋ณ€ํ™˜๋œ ๊ตฌ์„ฑ์„ ๋ฐฐํฌํ•˜๊ณ  ์ด์ œ ์‚ฌ์ดํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ง€์›์ด ๊ณต์‹ํ™”๋˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๊ฒƒ์ด ์ œ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@davidfowl ์ง€์ ํ•œ ๋งํฌ๋Š” ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. VS GUI ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ ๊ฒŒ์‹œ๋ฅผ ์œ„ํ•ด cli ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์ด ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉด web.config์—์„œ ASPNETCORE_ENVIRONMENT๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฐฌ์„ฑํ‘œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋ฐฑ๋กœ๊ทธ๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@orobert91 VS๋Š” ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ๋‘˜๋Ÿฌ์‹ผ GUI์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. VS ๋‚ด์—์„œ ๊ฒŒ์‹œํ•˜๋Š” ๋™์•ˆ https://github.com/nil4/xdt-samples/ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ web.config ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด ๋ช…๋ น์ค„๊ณผ IDE ๋‚ด์—์„œ ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

@svallis ์‹ค์ œ๋กœ ๋ฌธ์„œ๋ฅผ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๋ณต์‚ฌ ์ž‘์—…์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  <Target Name="CopyFiles" AfterTargets="Publish">  
      <Copy SourceFiles="web.$(Configuration).config" DestinationFiles="web.config" />  
  </Target>   

ํ™˜๊ฒฝ ์ด๋ฆ„์— ๋Œ€ํ•œ ๋ช…์˜ˆ๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” msbuild ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

$(ํ™˜๊ฒฝ ์ด๋ฆ„)

(https://github.com/aspnet/websdk/blob/d7d73e75918ec3168bd3e5d519d0decc04675faf/src/Publish/Microsoft.NET.Sdk.Publish.Targets/netstandard1.0/TransformTargets/Microsoft.NET.Transform7s9.Publish ).

์ง€๊ธˆ ์ด ์†์„ฑ์ด ์„ค์ •๋˜๋ฉด appsettings.$(EnvironmentName).json ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ํŒŒ์ผ์— ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์š”์ฒญ๋œ ๊ฒฝ์šฐ).

์•ž์œผ๋กœ ์ด ์†์„ฑ์ด ๊ฒŒ์‹œ ์ค‘์— ์„ค์ •๋˜๋ฉด ๊ฒŒ์‹œ๋œ web.config๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋‹ค์Œ ํ•ญ๋ชฉ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<environmentVariables>
      <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="$(EnvironmentName)" />
</environmentVariables>

์—ฌ๊ธฐ์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

environmentVariable ์„ค์ • ์ด์™ธ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ ํ•ต์‹ฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ web.config ๋ณ€ํ™˜( Xdt ) ์ด์‹ ๊ฐ€๋Šฅ์„ฑ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ์— ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ๋กœ์ปฌ์— ์žˆ๊ณ  ์Šคํ…Œ์ด์ง• ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด ๋ชจ๋‘ ์›๊ฒฉ ์„œ๋ฒ„(๋™์ผํ•œ ์„œ๋ฒ„)์— ์žˆ์Šต๋‹ˆ๋‹ค. IApplicationBuilder ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ URL์„ ๊ฐ€์ ธ์™€ switch ๋ฌธ์—์„œ ์‚ฌ์šฉํ•˜์—ฌ EnvironmentName ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ณต๋˜๋Š” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜๋ณด๋‹ค ํ›จ์”ฌ ๋œ "ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•"์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ํ™•์‹คํžˆ ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Startup.cs :

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            env.DetectAndSet(app);

            ... other config method stuff here ...
        }

์œ„์˜ ๋ฐฉ๋ฒ•์€ IApplicationBuilder ๋‚ด ์†์„ฑ ์ปฌ๋ ‰์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ๋ฉ”์„œ๋“œ(๋ฐ ํด๋ž˜์Šค)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Hosting.Server.Features;
using System.Linq;

namespace MyRootNamespace.Common.Extensions
{
    public static class IHostingEnvironmentExtensions
    {
        /// <summary>
        /// Detects the current hosting url and sets the <see cref="IHostingEnvironment.EnvironmentName"/> accordingly.
        /// </summary>
        /// <param name="env">The <see cref="IHostingEnvironment"/> to set.</param>
        /// <param name="app">The <see cref="IApplicationBuilder"/> used to retrieve the current app url.</param>
        public static void DetectAndSet(this IHostingEnvironment env, IApplicationBuilder app)
        {
            var _appUrl = string.Empty;

            try
            {
                _appUrl = ((FeatureCollection)app.Properties["server.Features"]).Get<IServerAddressesFeature>()?.Addresses?.FirstOrDefault();
            }
            catch { }

            switch (_appUrl)
            {
                case "https://www.myurl.com":
                case "http://www.myurl.com":
                    env.EnvironmentName = EnvironmentName.Production;
                    break;
                case "https://staging.myurl.com":
                case "http://staging.myurl.com":
                    env.EnvironmentName = EnvironmentName.Staging;
                    break;
                default:
                    env.EnvironmentName = EnvironmentName.Development;
                    break;
            }
        }
    }
}

์ด๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค( web.config ๋ณ€ํ™˜์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ).

๊ฑด๋ฐฐ!

ํ˜„์žฌ๋กœ์„œ๋Š” ์ด์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ/์ˆ˜์ • ์‚ฌํ•ญ์ด ๊ณ„ํš๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ํ† ๋ก ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ํŠน์ • ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด ์ฃผ์‹œ๋ฉด ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ณธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ์ •๋ง ๋งŒ์กฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. https://stackoverflow.com/questions/31049152/publish-to-iis-setting-environment-variable/36836533#36836533. ASPNETCORE_ENVIRONMENT ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•  ์žฅ์†Œ๋กœ ์„œ๋ฒ„์˜ ApplicationHost.config๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ IIS ์„œ๋ฒ„๋Š” ์šด์˜ ํŒ€์—์„œ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์กฐ์ง์˜ ๊ฐœ๋ฐœ์ž๋Š” ์–ด์จŒ๋“  ํ•ด๋‹น ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šด์˜ ํŒ€์€ PowerShell ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์‚ฌ์ดํŠธ๊ฐ€ ํ”„๋กœ๋น„์ €๋‹๋  ๋•Œ ApplicationHost.config์— ๊ด€๋ จ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋„๋ก ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฑฐ๊ธฐ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ณ  .NET Core ํ™˜๊ฒฝ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ƒํ™ฉ์— ์ž˜ ๋งž์•˜์Šต๋‹ˆ๋‹ค.

์ง„์ •ํ•œ DevOps ํ™˜๊ฒฝ์—์„œ๋Š” ์–ด์จŒ๋“  Azure๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  SDK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด msbuild ์†์„ฑ $(EnvironmentName) ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋„๊ตฌ๋Š” ASPNETCORE_ENVIRONMENT๋ฅผ ์ด ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ: EnvironmentName์ด ์Šคํ…Œ์ด์ง•์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ web.config์—๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

      <aspNetCore processPath="dotnet" arguments=".\WebApplication242.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
        </environmentVariables>
      </aspNetCore>

์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋Š” ํ™๋ณด:
https://github.com/aspnet/websdk/pull/377

@vijayrkn ์œ ๋งํ•œ ์‹œ์ž‘์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ๊ตญ VS WebDeploy/๊ฒŒ์‹œ ํ”„๋กœํ•„ ๋“ฑ์— ๋‚ด์žฅ๋œ ์ง€์›์„ ๊ฐ–๊ฒŒ ๋ ๊นŒ์š”?

์ง€๊ธˆ์€ ์ด ํ™˜๊ฒฝ ์ด๋ฆ„ ์„ ํƒ์„ ์œ„ํ•œ UI๊ฐ€ VS์— ์—†์ง€๋งŒ ์ด๊ฒƒ์ด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์ด๋‚˜ pubxml์— ์ถ”๊ฐ€๋˜๋ฉด VS์™€ ๋ช…๋ น์ค„์—์„œ ๊ฒŒ์‹œํ•  ๋•Œ ๋ชจ๋‘ ์ด๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ UI ์ง€์›๋„ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

@vijayrkn web.config ํŒŒ์ผ๋กœ ํผ๋ธ”๋ฆฌ์‹ฑํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค - ๋งž๋‚˜์š” ?

@vijayrkn ๋„ค, pubxml ํ˜•์‹์œผ๋กœ ์ง€์›์„ ๋ฐ›๋Š” ๊ฒƒ์€ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์œ ์šฉํ•˜๊ฒŒ ๋  ์ˆœ๊ฐ„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  XML ๋ณ€ํ™˜ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๊ณ  ๊ฐ pubxml ์ ์ ˆํ•œ ํ™˜๊ฒฝ ๋ฌธ์ž์—ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UI ์ง€์›์€ ๋‚˜์ค‘์— ์ œ๊ณต๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ผ€์ดํฌ์˜ ์žฅ์‹์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

@challamzinniagroup - ์•„๋‹ˆ์š”, ์ด ๊ธฐ๋Šฅ์—๋Š” web.config๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์„ pubxml ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ๊ฒŒ์‹œ ๋„๊ตฌ์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

<EnvironmentName>YourCustomEnvironment</EnvironmentName>

@challamzinniagroup , @vijayrkn

web.config์—์„œ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ํ™˜๊ฒฝ ๊ฐ„์— ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ์ด ์—†์œผ๋ฉด web.config๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘์‹ญ์‹œ์˜ค. 2์ค„์˜ ์ฝ”๋“œ๋กœ ์–ด๋””์„œ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒŒ์‹œ ํ”„๋กœํ•„์ด๋‚˜ ๊ฒŒ์‹œ๋œ ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ผ์น˜ํ•˜๋Š” appsetting.XYZ.json ๋ชฉ๋ก๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@ThisNoName

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด, ์„œ๋น„์Šค ๋์ , ์ž๊ฒฉ ์ฆ๋ช… ๋˜๋Š” dev->staging->production์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ(ํด๋ผ์šฐ๋“œ ์™ธ๋ถ€์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž„) web.config ๋ณ€ํ™˜์˜ ์œ ์—ฐ์„ฑ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Microsoft๊ฐ€ dotnet ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฆ‰์‹œ ์ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ์šฐ์Šค๊ฝ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด Azure์—์„œ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค์™€ ํ™˜๊ฒฝ ๊ฐ„์— 1-1 ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์•ฑ๊ณผ ๋ณ„๋„์˜ ๊ตฌ์„ฑ์œผ๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์šฐ๋“œ ์™ธ๋ถ€์—์„œ ์‹ค์ œ๋กœ ์ข‹์ง€ ์•Š์•„ ๋ฐฐํฌ๋ฅผ ์™„์ „ํžˆ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ด๋Ÿฌํ•œ ๋น„๋ฐ€์„ ์†Œ์Šค ์ œ์–ด์— ์ €์žฅํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ๋Œ€์‹  ํ™˜๊ฒฝ ์ž์ฒด์—์„œ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Transforms๋Š” ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ(ํŠนํžˆ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ) ๊ฒŒ์‹œ ์‹œ ๋ฐฐํฌ ๋Œ€์ƒ์„ ์ดํ•ดํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. N๊ฐœ์˜ ๋ฐฐํฌ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์ •๋ง๋กœ ๋‹ค์‹œ ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด์ œ ๋ถˆํ–‰ํ•œ ๋ถ€๋ถ„์€ IIS์—์„œ ์•ฑ ํ’€์ด ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ๋Œ€์ƒ ๋จธ์‹ ์— ๋จธ์‹  ์ „์ฒด ๊ตฌ์„ฑ์„ ์„ค์ •ํ•˜๋„๋ก ์˜๋„ํ•œ ์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ).

@willapp ์™œ appsettings.json ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@์œŒ์•ฑ

M$๋Š” ์™„๋ฒฝํ•œ ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ web.config ๋ณ€ํ™˜์˜ ๊ฐœ๋…์„ ๊ณ ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. IIS ๋ฐ”์ด๋„ˆ๋ฆฌ ๋””๋ ‰ํ† ๋ฆฌ ์™ธ๋ถ€์˜ ์•„๋ฌด ๊ณณ์—๋‚˜ ํ™˜๊ฒฝ ๊ฐ’์„ ๋˜์ง€๊ณ  program.cs์—์„œ ์ฝ๊ธฐ/์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • IIS๋ฃจํŠธ

    • MySiteDEV

    • ํฐ ์ƒ์ž



      • ์•ฑ ์„ค์ •.json


      • ์•ฑ ์„ค์ •.DEV.json


      • appsettings.PROD.json


      • web.config



    • ๋กœ๊ทธ

    • ํ™˜๊ฒฝ DEV

    • MySitePROD

    • ํฐ ์ƒ์ž



      • ์•ฑ ์„ค์ •.json


      • ์•ฑ ์„ค์ •.DEV.json


      • appsettings.PROD.json


      • web.config



    • ๋กœ๊ทธ

    • env.PROD

@davidfowl

ASP.NET ์ฝ”์–ด๊ฐ€ IIS์™€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ถˆํ–‰ํ•˜๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Microsoft .NET Core Architect๋กœ์„œ?

Core์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์€ ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. IIS๋Š” ๋ถ„๋ช…ํžˆ Windows ์œ ํ‹ธ๋ฆฌํ‹ฐ์ด๋ฏ€๋กœ ์•ฝ๊ฐ„์˜ ์„ฑ์žฅํ†ต์„ ์˜ˆ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์˜ˆ์ƒํ•˜๊ณ  ์ƒํ™ฉ์ด ์ง„ํ–‰๋จ์— ๋”ฐ๋ผ ์ˆ˜์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Windows ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Core์—์„œ ์˜๋„์ ์œผ๋กœ ๋””์ž์ธ์„ ์„ ํƒํ–ˆ๋‹ค๋ฉด ์ง๊ด€์ ์ด์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํŽธ์ง‘:
์ด๊ฒƒ์€ Core๊ฐ€ IIS์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ๋‚˜์€ ์ง€์›์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋Œ€์•ˆ์ด๋ผ๋Š” ๋…ผ์˜๋Š” ...

@davidfowl

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•„ํ‚คํ…์ฒ˜์™€ SME์˜ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. ์ €๋Š” FTSE100์—์„œ ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ์—์„œ ๋ฐฐํฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์ง€๋งŒ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ์ดํŠธ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋‹จ์ผ ์„œ๋ฒ„๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๊ณ  ๋น„์šฉ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. Web Deploy + Transforms๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐ๋‹ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๊ฒ€์ฆ๋œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ฉฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ .net ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ฝ”์–ด๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ์นœ์ˆ™ํ•จ์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  Microsoft๋Š” ๋ณ€ํ™˜์„ ๊ณ„์† ์ง€์›ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์ง€๊ธˆ ๋‚ด ์†”๋ฃจ์…˜์ด ์žˆ์œผ๋ฏ€๋กœ ์ถฉ๋ถ„ํžˆ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ์ด๊ฒƒ์„ ํ‘œ์ค€์œผ๋กœ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ๊ณต์„ ์•ฝ๊ฐ„ ๋–จ์–ด ์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@์œŒ์•ฑ

๋ณ€ํ™˜์€ ์†Œ์Šค์—์„œ ์ปดํŒŒ์ผํ•˜๊ณ  ๊ฐ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ๋ณ„๋„๋กœ ๊ฒŒ์‹œํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์•ˆ์ด ํ›จ์”ฌ ๋” ์šฐ์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— M$๊ฐ€ ์‚ญ์ œํ•œ ๊ฒƒ์ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ƒˆ ์„ค์ •์—์„œ๋Š” ๋ฆด๋ฆฌ์Šค ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ๋งŒ ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ์›๋ณธ์˜ ๋™์ผํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ณต์‚ฌ๋ณธ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ๋Š” ๋‹ค์Œ ํ™˜๊ฒฝ DEV=>TEST=>Staging=>PROD์— ๋Œ€ํ•œ ๋‹จ์ˆœํ•œ ํŒŒ์ผ ๋™๊ธฐํ™”์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ASP.NET ์ฝ”์–ด๊ฐ€ IIS์™€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ถˆํ–‰ํ•˜๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Microsoft .NET Core Architect๋กœ์„œ?

์‚ฌ๋žŒ๋“ค์€ ์ด์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์‹œ์Šคํ…œ์ด ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ฆ‰์‹œ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ Windows์—์„œ ์‚ฌ๋žŒ๋“ค์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœ์„ธ์Šค๋ณ„์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ์‹๋ณ„ํ•˜์—ฌ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. IIS 10์€ ์•ฑ ํ’€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ณ„ ์ถ”๊ฐ€ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ASP.NET Core ๋ชจ๋“ˆ์€ ํ”„๋กœ์„ธ์Šค๋‹น ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ด ๊ธฐ๋Šฅ์€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ๊ธฐ์„œ ์ƒ๊ฐ์˜ ์ฒ ํ•™์  ๋ณ€ํ™”๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์ผ์–ด๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐœ๋ฐœ ์‹œ ๋น„๋ฐ€์„ ๋” ์‰ฝ๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ฒƒ๋„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@challamzinniagroup ์ข‹์€ ์š”์•ฝ

์ด๊ฒƒ์€ Core๊ฐ€ IIS์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ๋‚˜์€ ์ง€์›์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋Œ€์•ˆ์ด๋ผ๋Š” ๋…ผ์˜๋Š” ...

์˜ค๋ฅธ์ชฝ. ํ™˜๊ฒฝ๋ณ„ ์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์›Œํฌํ”Œ๋กœ๋Š” ์—ฌ์ „ํžˆ ํŠน์ • ํ™˜๊ฒฝ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๊ฑฐ๊ธฐ์—์„œ ์–ป๋Š๋ƒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ์˜ ์ผ๋ถ€์ž…๋‹ˆ๊นŒ?

์ด ๋ชจ๋“  ๊ฒƒ์€ 2.2์˜ ๋„๊ตฌ์—์„œ ์ด์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ: @vijayrkn

@davidfowl

"์—ญ์‚ฌ์ ์œผ๋กœ Windows์—์„œ ์‚ฌ๋žŒ๋“ค์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœ์„ธ์Šค๋‹น์ด ์•„๋‹Œ ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ๋•Œ ๋ช…๋ น์ค„ SET์—์„œ์™€ ๊ฐ™์ด Windows ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

.NET ํ•ต์‹ฌ ์ปจํ…์ŠคํŠธ ๋‚ด์˜ "ํ™˜๊ฒฝ"์— ๋Œ€ํ•œ ์ดํ•ด๋Š” ๋ณ€์ˆ˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ system ๋˜๋Š” web.config์—์„œ ASPNETCORE_ENVIRONMENT๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ทœ์น™์— ๋”ฐ๋ผ ๋ชจ๋“  ์†Œ์Šค์—์„œ ๋ฎ์–ด์“ฐ๊ณ  ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋ณธ์งˆ์ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? Microsoft .NET ํŒ€์˜ ๊ณต์‹ ์ž…์žฅ์ด ํ•˜์ง€ ๋ง๋ผ๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์‹ฌ๊ฐํ•˜๊ฒŒ ์žฌ๊ณ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ IIS์—์„œ .NET Core๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  ๋งํ•˜๊ฒŒ ๋˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ด๋Ÿฌํ•œ ์•ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”.

@ThisNoName

"์—ญ์‚ฌ์ ์œผ๋กœ Windows์—์„œ ์‚ฌ๋žŒ๋“ค์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ”„๋กœ์„ธ์Šค๋‹น์ด ์•„๋‹Œ ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ๋•Œ ๋ช…๋ น์ค„ SET์—์„œ์™€ ๊ฐ™์ด Windows ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ( ์—ฌ๊ธฐ ์ฐธ์กฐ). David๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด๋Š” ํ”„๋กœ์„ธ์Šค๋‹น์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด ๊ฒฝํ—˜์ƒ dotnet core์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์„œ๋Š” ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ์„ค์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ๋™์ผํ•œ ์„œ๋ฒ„์— ์—ฌ๋Ÿฌ ์•ฑ ์ธ์Šคํ„ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์—†๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋™์ผํ•œ ํ™˜๊ฒฝ ๊ฐ’์„ ์„ ํƒํ•˜๋ฏ€๋กœ dev/staging/prod๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

IIS10์ด ์•ฑ ํ’€๋ณ„๋กœ ์„ค์ •์„ ์ง€์›ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค... Server 2016์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด. ๋‚˜๋Š” 2012๋ฅผ ์‹คํ–‰ ์ค‘์ด๋ฏ€๋กœ ์ด๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋‚ด ๋ฌธ์ œ๋Š” Microsoft๊ฐ€ ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ผ์„ ์˜ฎ๊ธฐ๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ASP.NET ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐฐํฌํ•  ๋•Œ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ๋˜ ๊ฒƒ์— ๋Œ€ํ•œ '๋ ˆ๊ฑฐ์‹œ' ์ง€์›์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ˆ˜์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์ƒˆ๋กœ์šด ํŒจํ„ด์„ ๋„์ž…ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฅผ ์ฑ„ํƒํ•˜๋„๋ก ์žฅ๋ คํ•˜๋˜, ํ•„์š”๋กœ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๊ฑฐ์˜ ์—†๋‹ค๋Š” ํ™•์‹ ์ด ๋“ค ๋•Œ๊นŒ์ง€ ๊ธฐ์กด ๋™์ž‘์„ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด dotnet core๋ฅผ ์›ํ•˜์ง€๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๊ฐ€ ๋„ˆ๋ฌด ๊ณ ํ†ต์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ณ ๊ฐ์„ ์œ„ํ•ด ์žฅ๋ฒฝ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

@์œŒ์•ฑ

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ๊ธฐ๋ณธ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ™˜๊ฒฝ์„ ์ฝ๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์„ ์ง€์ ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ ์–ด๋„ ๊ทธ๊ฒƒ์€ ๋‚ด ์ดํ•ด์ž…๋‹ˆ๋‹ค.

   public class Program   {
        public static void Main(string[] args)   {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)   {
               return WebHost.CreateDefaultBuilder(args)
                .UseEnvironment(ReadEnvFromWherever())
                .UseStartup<Startup>()
        }

        private string ReadEnvFromWherever() { 
              // Get and return whatever by your own convention
              return "DEV";
        }
    }

@ThisNoName

์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์€ ์†”๋ฃจ์…˜ ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ VSTS์—์„œ ์›น ๊ฒŒ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•  ๋•Œ "ReadEnvFromWherever" ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๊นŒ? ์ „์ฒ˜๋ฆฌ๊ธฐ ์ง€์‹œ๋ฌธ(#if RELEASE ...)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ๊ฝค ๋”๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

"์ด์ „ ์„ธ๊ณ„"(ASP.NET ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ)์—์„œ ๊ฒŒ์‹œ ํ”„๋กœํ•„์„ ๋งŒ๋“ค๊ณ  ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๋นŒ๋“œํ•  ์†”๋ฃจ์…˜ ๊ตฌ์„ฑ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ dev/staging/prod์— ๊ฒŒ์‹œํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ๋ณ€ํ™˜์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์›Œํฌํ”Œ๋กœ๊ฐ€ ๋‹จ์ผ ๋นŒ๋“œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์™€ ๊ฐ ํ™˜๊ฒฝ์„ ํ†ตํ•ด ํ‘ธ์‹œํ•˜๋Š” ์ตœ์‹  CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋งž์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ VSTS ๋ฆด๋ฆฌ์Šค ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋ฐฐํฌ ์‹œ ์„ค์ •์„ ์ฃผ์ž…ํ•˜๊ฑฐ๋‚˜ ํ”„๋ผ์ž„ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์ž์— ๋†“๊ธฐ๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋งŽ์€ SME์™€ 1์ธ ๋ฐด๋“œ๊ฐ€ ์ด ์œ„์น˜์— ์—†์œผ๋ฉฐ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” Visual Studio์—์„œ ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ IIS์—์„œ ์‹คํ–‰๋˜๊ณ  ์ „ํ†ต์ ์œผ๋กœ ASP.NET ํ˜ธ์ŠคํŒ…์„ ์ œ๊ณตํ•˜๋Š” ๊ณต์œ  ํ˜ธ์ŠคํŒ… ํ”Œ๋žซํผ์— ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐ์—๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ˜ธ์ŠคํŒ… ์ œ์–ดํŒ์„ ํ†ตํ•ด ์›น ์‚ฌ์ดํŠธ๋ณ„๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ์œ ์ผํ•œ ํ˜„์‹ค์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ณ€ํ™˜ ๋ฐ web.config ์ž…๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ด๋ฉฐ VS ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์กฐ๊ธˆ ๋” ๋‚˜์•„์งˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŒ… ์ œ๊ณต์—…์ฒด ๋ฐ ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด ๊ธฐ๋Šฅ์— ์˜์กดํ•˜๋Š” ๊ธฐ์กด ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@์œŒ์•ฑ

๊ด€๋ก€์ƒ. ์ด์ „์— ๊ฒŒ์‹œํ•œ ์˜ˆ์ œ๋กœ ์ด๋™ํ•˜๋ฉด ์ƒ์œ„ ํด๋”์—์„œ env.DEV๋ฅผ ์ฝ๊ณ  ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฑ ๋ฃจํŠธ์˜ ์ด๋ฆ„์„ MySiteDEV, MySitePROD ๋“ฑ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ํด๋” ์ด๋ฆ„์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ํ™˜๊ฒฝ ์ด๋ฆ„์„ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ IHostingEnvironment .EnvironmentName์—์„œ ํ™˜๊ฒฝ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜ ๋˜๋Š” web.config์—์„œ ASPNETCORE_ENVIRONMENT๋ฅผ ์ฝ๋Š” .NET ์ฝ”์–ด์™€ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@ThisNoName

๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  _env.DEV_๋ฅผ ์ƒ์œ„ ํด๋”๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ•˜๋ ค๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚œ ๋‹น์‹ ์ด ์—ฌ๊ธฐ์— ํฌ์ธํŠธ๋ฅผ ๋ˆ„๋ฝ ์ƒ๊ฐ : ๊ทธ๋ƒฅ ์ผํ•œ ์•„์›ƒ - ์˜ค๋ธŒ - ๋ฐ•์Šค ์†”๋ฃจ์…˜์œผ๋กœ๋„ ์‚ฌ์šฉ๋œ๋‹ค. ์ด์ œ ๋„๊ตฌ ์ง€์›์ด dotnet ํ•ต์‹ฌ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—†์Šต๋‹ˆ๋‹ค.

์ œ๊ฑฐ๋œ ์ด์œ ๋Š” ์•Œ์ง€๋งŒ(์ถฉ๋ถ„ํ•œ CI ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ์ „ํžˆ ๋งŽ์ด ์›ํ•  ๋•Œ ๊ทผ์‹œ์•ˆ์ ์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@์œŒ์•ฑ

์ดˆ๊ธฐ ์„ค์ • ์ค‘์— ํ•œ ๋ฒˆ ๋ณต์‚ฌํ•˜๊ณ  ๋ชจ๋“  ํ–ฅํ›„ ๋ฐฐํฌ๋Š” bin ํด๋”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์žฌ์ปดํŒŒ์ผ, ๊ฒŒ์‹œ, ๋ณ€ํ™˜์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ๋งŒ ํ•˜๊ณ  ์ถ”๊ฐ€๋กœ 3์ค„์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? M$์ž…๋‹ˆ๋‹ค. 3๊ฐœ์›” ์ „๊นŒ์ง€๋งŒ ํ•ด๋„ .NET Core์—์„œ Active Directory๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@ThisNoName ๋‹น์‹ ์€ ์ด M$ ๋ฌผ๊ฑด์„ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๊นŒ? 2018๋…„์ธ๊ฑฐ ์•„์‹œ์ฃ ?

๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ์›น์„ ๊ณต์œ  ํ˜ธ์ŠคํŒ… ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•˜๋Š” ๋งฅ๋ฝ์—์„œ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌด์—‡์„ ์ฐฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ๊ฒŒ์‹œ ํ”„๋กœํ•„์— ์ง€์ •๋  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ์ด ASP.NET Core์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์— ์ถ”๊ฐ€๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ณ€ํ™˜์ด๋‚˜ ์–ด๋–ค ๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋Š” ํด๋” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋น„ํ‘œ์ค€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@willapp , @svallis
๋‚ด๊ฐ€ ์กฐ๊ธˆ ๋” ์œ„๋กœ ๊ฒŒ์‹œํ•œ ์†”๋ฃจ์…˜์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. URL์„ ๊ฐ€์ ธ์™€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ˜ธ์ŠคํŒ… ํ™˜๊ฒฝ์—์„œ URL์„ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ "ํ•ดํ‚น"์ด๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ํ˜ธ์ŠคํŒ… ํšŒ์‚ฌ์˜ ๊ฒฝ์šฐ ๋‚ด๊ฐ€ ๋ฐ›์€ URL์€ localhost:port base("127.0.0.1:7777")์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ด์ƒ์ ์ด์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •ํ•œ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๋ฃจํŠธ ํด๋” ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ ์•ฑ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋„ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

        public static string DetectAndSet(this IHostingEnvironment env, ILogger logger)
        {
            switch (env.ContentRootPath)
            {
                case "h:\\root\\home\\www\\api":
                    env.EnvironmentName = EnvironmentName.Production;
                    break;
                case "h:\\root\\home\\www\\api-staging":
                    env.EnvironmentName = EnvironmentName.Staging;
                    break;
                default:
                    env.EnvironmentName = EnvironmentName.Development;
                    break;
            }

            logger.LogInformation($"Application root path discovered as '{env.ContentRootPath}'. Environment set to '{env.EnvironmentName}'");

            return env.EnvironmentName;
        }

ํ™˜๊ฒฝ์ด ์ฝ”๋“œ ๋‚ด์—์„œ, ๋ฐฐํฌ ์‹œ ๊ฒฐ์ •๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๋˜๋Š” ์‚ฌ์ „์— ํ™˜๊ฒฝ์—์„œ ์ง์ ‘ ์‚ฌ์ „ ๊ฒฐ์ •๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ ํƒ์€ ๋‚ด๊ฐ€ ๋‹ค๋ฃจ๋ ค๊ณ  ํ•˜๋Š” ๋…ผ์˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ์ˆœํžˆ ํ•ด๋‹น SME/ ํ˜ธ์ŠคํŒ… ์ œ์–ด๊ฐ€ ์ œํ•œ๋˜์–ด ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฐœ์ธ. ์ œ ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์ด ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ์ œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋‹ค์šด์ŠคํŠธ๋ฆผ ๋‹ค์Œ์„ ํฌํ•จํ•˜์—ฌ ๋ณ€ํ™˜ ์—†์ด appsettings.json ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ ๊ฐ’์„ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"{configName}.{environmentName}": "{value}"

์„ค์ • ํŒŒ์ผ์— ์žˆ๊ณ  ๊ตฌ์„ฑ๋‹น 3๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ). ์ด ํŒŒ์ผ์—๋Š” ์•„์ฃผ ์ ์€ ์ˆ˜์˜ ๊ตฌ์„ฑ๋งŒ ์žˆ์œผ๋ฏ€๋กœ ๋ณต์ œ๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@challamzinniagroup ๊ด€๋ก€์ƒ ์ƒ๋Œ€ ํด๋” ๊ฒฝ๋กœ์™€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

@svallis ์ „์ฒด ๊ฐœ๋…์€ ํ•œ ๋ฒˆ ๊ฒŒ์‹œํ•˜๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒŒ์‹œ ํ”„๋กœํ•„๋ณ„๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

@ThisNoName ๋‹น์‹ 

@challamzinniagroup ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒํ™ฉ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์€ ํ™˜๊ฒฝ์€ ๋ณ€์ˆ˜์ผ ๋ฟ์ด๋ฉฐ Microsoft๊ฐ€ ์ฐจ์„ ์ฑ…์„ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์ด ๋ฌด์—‡์ด๋“ ์ง€ ๊ฐ„์—, ์–ด์จŒ๋“  ์‹œ์Šคํ…œ์ด๋‚˜ web.config ๋ฐ ์„ค์ • ํ™˜๊ฒฝ์—์„œ ์ผ๋ถ€ ๊ฐ’์„ ์ฝ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

BTW, ์—ฌ์ „ํžˆ ๊ทœ์น™์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. appsettings๋Š” ๋‹จ์ผ ์ค‘๊ฐ„ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ  Staging/Production์€ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ๋ง์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ผ์น˜์‹œํ‚ฌ ํด๋” ์ด๋ฆ„์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

appsettings.api.json
appsettings.api-staging.json

๊ทœ์น™ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ์ปดํŒŒ์ผ ๋ฐ/๋˜๋Š” ๋‹ค์‹œ ๊ฒŒ์‹œํ•  ํ•„์š” ์—†์ด ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์Šคํ•€์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@vijayrkn pubxml ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋‚ด SDK๋ฅผ 2.1.302(x64)๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ pubxml์ด ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ ๊ฒŒ์‹œ๋œ web.config์—์„œ ์ฐจ์ด์ ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@wggley - ์ˆ˜์ • ์‚ฌํ•ญ์€ 2.1.302์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ cli์˜ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://dotnetcli.blob.core.windows.net/dotnet/Sdk/release/2.1.4xx/dotnet-sdk-latest-win-x64.exe

์œ„์˜ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฒ„์ „์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@vijayrkn ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์ƒˆ ๊ฒŒ์‹œ์— ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
@frankhoffy ์†”๋ฃจ์…˜์ด ์ €์—๊ฒŒ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์‹ถ์Šต๋‹ˆ๋‹ค .
https://stackoverflow.com/questions/31049152/publish-to-iis-setting-environment-variable/36836533#36836533
์ฒซ ๋ฒˆ์งธ ๋‹ต๋ณ€(๊ฐ€์žฅ ๋งŽ์ด ํˆฌํ‘œ๋œ ๋‹ต๋ณ€)์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์‹œ ์ค‘ ์›น ๊ตฌ์„ฑ ๋ณ€ํ™˜ ์ง€์›์€ ์ด์ œ 2.2 ๋ฏธ๋ฆฌ ๋ณด๊ธฐ1 https://www.microsoft.com/net/download/dotnet-core/2.2 ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@vijayrkn ์–ด๋”˜๊ฐ€์— ๊ธฐ๋ณธ ์ƒ˜ํ”Œ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ASPNETCORE_ENVIRONMENT๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋ณธ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ hello world์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ASPNETCORE_ENVIRONMENT๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๋Š” msbuild ์†์„ฑ '$(EnvironmentName)'์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. web.config ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์ƒ˜ํ”Œ์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ƒ˜ํ”Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. https://github.com/vijayrkn/webconfigtransform

Readme์—๋Š” ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/vijayrkn/webconfigtransform/blob/master/README.md

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@Eilon - ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฉฐ ์ตœ์‹  ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@vijayrkn ๊ฒŒ์‹œ ์„ค์ • ๋Œ€ํ™” ์ƒ์ž์—์„œ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋„๋ก ๊ฒŒ์‹œ ์„ค์ •์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‘ ์‚ฌ์ดํŠธ๊ฐ€ ๋™์ผํ•œ ์„œ๋ฒ„์— ๋ฐฐํฌ๋˜๋Š” ๊ฒฝ์šฐ ์Šคํ…Œ์ด์ง• ์‚ฌ์ดํŠธ์™€ ํ”„๋กœ๋•์…˜ ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋Œ€ํ™” ์ƒ์ž์—์„œ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

.NET Core์˜ ์ด๋Ÿฌํ•œ ์ธก๋ฉด์€ ๋งค์šฐ ์ง€์ €๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํด๋”๋ณ„๋กœ ํ™˜๊ฒฝ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์„œ๋ฒ„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์šฐ๋ฆฌ ์ƒํ™ฉ์—์„œ ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ”„๋กœ๋•์…˜ ์‚ฌ์ดํŠธ์™€ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ์Šคํ…Œ์ด์ง• ์‚ฌ์ดํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์„ค์ •์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•˜์ง€๋งŒ ์ œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์€ ์•„๋‹™๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/vijayrkn/webconfigtransform/blob/master/README.md ( @vijayrkn ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์‹ค์ œ ๋ฌธ์„œ์—

@vijayrkn ๊ฒŒ์‹œ ๋Œ€ํ™” ์ƒ์ž์—์„œ ์ด์— ๋Œ€ํ•œ ์ง€์›์ด ์–ผ๋งˆ๋‚˜ ๋ฉ๋‹ˆ๊นŒ?

ํ˜„์žฌ ๊ฒŒ์‹œ ๋Œ€ํ™” ์ƒ์ž์—๋Š” ๊ฒŒ์‹œ ํ™˜๊ฒฝ ์„ค์ •์ด ์ง€์›๋˜์ง€ ์•Š์ง€๋งŒ ๊ฒŒ์‹œ ํ”„๋กœํ•„์—์„œ ํ™˜๊ฒฝ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๋ณ€ํ™˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@nmg196 - web.config์—์„œ 'ASPNETCORE_ENVIRONMENT'๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด publishprofile์— ํ™˜๊ฒฝ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:
https://github.com/vijayrkn/webconfigtransform/blob/master/Properties/PublishProfiles/FolderProfile.pubxml#L18

๊ณ ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค(ASPNETCORE_ENVIRONMENT ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • ์ œ์™ธ)์˜ ๊ฒฝ์šฐ ์œ„ ๋ฌธ์„œ์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ web.config ๋ณ€ํ™˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@davidfowl - Angelos์—๋Š” web.config ๋ณ€ํ™˜ ์ง€์›์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@vijayrkn TFS์˜ CI/CD์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”? TFS์—์„œ p:CustomTransformFileName๊ณผ ํ•จ๊ป˜ dotnet publish๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด msbuild ์†์„ฑ์„ dotnet publish์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒ˜ํ”Œ์€ https://github.com/vijayrkn/webconfigtransform/blob/master/publish.cmd ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด CustomTransformFileName ์†์„ฑ์ด dotnet publish์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging /p:CustomTransformFileName=custom.transform

@vijayrkn
๊ท€ํ•˜์˜ ๋ฌธ์„œ๋ฅผ ์ฝ์—ˆ์œผ๋ฉฐ web.config๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ readme.md์— ์žˆ๋Š” ๋ชจ๋“  ๋ช…๋ น์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ทธ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ณ€ํ™˜์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Microsoft.Web.XmlTransform.dll์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ ์ž‘์—…๊ณผ ๋ณ„๋„๋กœ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” powershell ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ์งˆ๋ฌธ์€ ์–ด๋–ค ๋ฒ„์ „์˜ msbuild์™€ dotnet์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :
๋‹ท๋„ท --๋ฒ„์ „ 2.1.104
๋‹ท๋„ท msbuild - ๋ฒ„์ „ 15.6.84.34536

๊ฐ์‚ฌ ํ•ด์š”

@stephenarsenault1
๊ธฐ๋Šฅ์„ ์ผœ๋ ค๋ฉด ์—ฌ๊ธฐ์—์„œ ๋นŒ๋“œ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - https://www.microsoft.com/net/download/dotnet-core/2.2

์ตœ์‹  - https://www.microsoft.com/net/download/thank-you/dotnet-sdk-2.2.100-preview3-windows-x64-installer

@davidfowl ์€ ๋‹ค์Œ

https://github.com/vijayrkn/webconfigtransform/blob/master/README.md ( @vijayrkn ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์‹ค์ œ ๋ฌธ์„œ์—

@vijayrkn ๊ฒŒ์‹œ ๋Œ€ํ™” ์ƒ์ž์—์„œ ์ด์— ๋Œ€ํ•œ ์ง€์›์ด ์–ผ๋งˆ๋‚˜ ๋ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ์‹ค์ œ ๋ฌธ์„œ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์ œ ๊ฒŒ์‹œ ํ”„๋กœํ•„์—์„œ <EnvironmentName> ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ข€ ๋” ์ž˜ ๋ณด์ด๋„๋ก ์ด ์œ„์— UI๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚˜์ค‘์— ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

dotnet publish์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ web.config ๋ณ€ํ™˜์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .NET Core SDK 2.2.101์„ ์„ค์น˜ํ•œ ํ›„ CI/CD ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด dotnet publish ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ๋œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ํŒŒ์ดํ”„๋ผ์ธ( ํ•œ ๋ฒˆ ๋นŒ๋“œ ๊ทœ์น™ ), ๋ณ€ํ™˜์€ ์‹ค์ œ ๋ฐฐํฌ์— ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(Octopus์—์„œ ์ˆ˜ํ–‰). ๋ฌธ์„œ์—์„œ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ํ›„ web.config์—์„œ ๊ตฌ์„ฑ ๋ธ”๋ก์ด ๋‘ ๋ฐฐ๋กœ ๋œ ์ด์œ ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ณ€ํ™˜์€ dotnet publish ๋ฐ ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ ๋„๊ตฌ์— ์˜ํ•ด ๋‘ ๋ฒˆ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled> ์„ค์ •์œผ๋กœ web.config ๋ณ€ํ™˜์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ํ›„ TransformWebConfig๋„ ๊ฑด๋„ˆ๋›ฐ์—ˆ์Šต๋‹ˆ๋‹ค(TransformXml๊ณผ ํ•จ๊ป˜). ๊ฒฐ๊ณผ์ ์œผ๋กœ %LAUNCHER_PATH% ๋ฐ %LAUNCHER_ARGS% ๋ณ€์ˆ˜๊ฐ€ ๊ฒŒ์‹œ ํ”„๋กœ์„ธ์Šค ์ค‘์— ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์„ค์ •์ด ์žˆ์Šต๋‹ˆ๊นŒ?

App.Config ํŒŒ์ผ์ด ์žˆ๋Š” ์ฝ˜์†” ์•ฑ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋ณผ๊นŒ์š”?

@dmitryshunkov $(RunXdt)๋ฅผ false๋กœ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • Xml ๋ณ€ํ™˜ ์‹คํ–‰์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@auserx - sdk ์Šคํƒ€์ผ ํ”„๋กœ์ ํŠธ์ธ ๊ฒฝ์šฐ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰