๋๋ 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
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๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ค๋ง. ๋์ผํ ์์คํ ์์ ๋์ผํ ์ฌ์ดํธ์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ ํจ์ฌ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
IIS ์ฑ์ด bin ๋ฐ program.cs๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
.UseEnvironment(ReadEnvExtensionFromParentFolder())
๊ทธ๊ฒ ๋ค์ผ ์ํ๋ ๋งํผ ์ฌ์ดํธ๋ฅผ ๊ฐ์ง ์ ์๊ณ ๋ณํ์ ๋ํ ๊ฑฑ์ ์์ด bin์ ๋ฐฐํฌํ ์ ์์ผ๋ฉฐ env.Whenver์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ฌ ํ๊ฒฝ์ ์ ํํ ์๋ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ฐฌ์ฑํ๋ค. ํ ์คํธ ํ๊ฒฝ์์ ์๋ํ์ง ์๋ ํ๋ก๋์ ์๋ฒ์ ๋ํด URL ์ฌ์์ฑ์ ๊ตฌ์ฑํ์ต๋๋ค. ๋ฐฐํฌ์ ์ ํฉํ web.config ํ์ผ์ ์ ํํ๋ ๊ฒ์ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ์๋์ผ๋ก ๋ณต์ฌํด์ผ ํฉ๋๋ค.
https://github.com/nil4/xdt-samples/ ๋ฐ ๊ฒ์ ์ ๋ณํ์ ์ ์ฉํ๊ธฐ ์ํ CLI ๋๊ตฌ๋ฅผ ์ดํด๋ณด์ญ์์ค.
์ด์ ๋ํ ์ง์ ์ด ์์ต๋๊น? ์ด๊ธฐ ๋ณด๊ณ ์ ์ดํ 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์์ ์ฝ๊ธฐ/์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
@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์ ํ๊ฒฝ ์ด๋ฆ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๊ณ ๊ธ ์๋๋ฆฌ์ค(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 ์คํ์ผ ํ๋ก์ ํธ์ธ ๊ฒฝ์ฐ ์๋ํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฒซ๊ธ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ค๊ณ์ ๋งค์ฐ ์ ์ฐํ์ง๋ง ๊ฒฐ๊ตญ ์๋ํํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ด ๊ฒ์ผ๋ก ํ๋ช ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค๋ฅธ ์๋ฒ์ IIS์ ๊ฒ์ํ๋ ์ฑ์ด ์์ต๋๋ค. ๋ํ ํด๋ ๊ฒ์๋ฅผ ํตํด ๋ก์ปฌ IIS์์ ์คํ๋ฉ๋๋ค. ๊ทธ๋์ web.config์์ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฒ์ํ๋ ๋์ ํ๋ก๋์ ๋๋ ๋ฌด์์ด๋ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ฝค ํํ ์์ ์ธ ๊ฒ ๊ฐ์์. ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ฃ ? ์๊ฒฉ ์๋ฒ์์ web.config๋ฅผ ์๋์ผ๋ก ํธ์งํด์ผ ํฉ๋๋ค.
์ด์์ ์ผ๋ก ์ค์ ํ๊ฒฝ์ "dotnet publish"(๋ชจ๋ ๊ฒ์ ๋์์ ๋ํด)๋ฅผ ํตํด ์ง์๋์ด์ผ ํฉ๋๋ค.
dotnet publish
๋web.%Enviroment%.config
(Web.Production.config, Web.Development.config) ํ์ผ์ ๊ฒ์ํ์ฌ web.config์ ๋ณํฉ(๋ณํ)ํ ์ ์์ต๋๋ค. ๊ฒฐ๊ตญ ASPNETCORE_ENVIRONMENT์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.