웹 구성 변환이 작동하지 않습니다.
MVC 에서는 에 과 같은 .NET MVC 3.0 응용 프로그램에서 다음과 같은 구성이 있습니다.appSettings
:
web.config
<appSettings>
<add key="SMTPHost" value="mail.domain.com"/>
<add key="SMTPUsername" value="user@gmail.com"/>
<add key="SMTPPort" value="25"/>
<add key="SMTPPwd" value="mypassword"/>
<add key="EmailFrom" value="notific@gmail.com"/>
</appSettings>
디버깅을 위해 다음과 같은 구성 변환이 정의되어 있습니다.
web.debug.config
<appSettings>
<add key="SMTPPort" value="58" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>
응용 프로그램을 "" "" SMTP" "" "" "" ""에서 .web.config
,것은 아니다.web.Debug.config
.
이 구성에서 무엇이 잘못되었을 수 있는지 제안할 수 있는 사람이 있습니까?
Web.config 변환은 게시 작업의 일부로만 적용됩니다.
만약 당신이 이것을 일부로 하기를 원한다면,app.config
SlowCheetah - XML Transforms Visual Studio 플러할용수있다습니사빌작을드인그업수행을음다한▁xmlche.
http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5
안타깝게도 Visual Studio(2010 - 2019)는 디버깅하는 동안 직접 지원하지 않으며 게시용으로만 제공됩니다. SlowCheetah(표시된 답변)라는 확장명을 사용하더라도 저에게는 작동하지 않습니다(web.config가 아닌 app.config를 사용하는 프로젝트에만 해당).
.msproj 파일을 수정하여 변환된 버전으로 현재 web.config를 덮어쓰는 방법을 설명합니다.
먼저 이 해결 방법을 옵션 1로 설명하겠지만, 최근에 사용하기 쉬운 다른 옵션 2를 발견했습니다(원하는 경우 옵션 2로 직접 스크롤할 수 있음).
옵션 1: 원본 코드 프로젝트 문서(위 링크 참조)에서 가져온 지침을 추가했습니다. 스크린샷이 이미 사라졌기 때문에 전체 정보를 잃고 싶지 않습니다.
VS.Net은 로컬 환경을 개발하고 디버깅할 때 변환을 수행하지 않습니다.하지만 여러분이 원한다면 이를 실현하기 위해 할 수 있는 몇 가지 단계가 있습니다.
- 먼저 VS에서 원하는 구성을 생성합니다.기본 디버그 및 릴리스가 수행하려는 작업에 충분하지 않다고 가정합니다.
- 마우스 오른쪽 단추를 클릭합니다.
web.config
Add Config Transforms(구성 변환 추가)를 선택합니다. 그러면 정의된 각 구성에 대해 종속적인 변환 구성이 생성됩니다. - 이이을바수다있니습꿀제의 을 바꿀 수 .
web.config
web.base.config
. - 추가
web.config
당신의 프로젝트에.빌드를 할 때마다 덮어쓰게 되므로 내용은 중요하지 않지만 프로젝트의 일부를 원하기 때문에 VS.Net에서는 "프로젝트가 디버깅용으로 구성되지 않았습니다" 팝업을 표시하지 않습니다. - 프로젝트 파일을 편집하고 다음을 추가합니다.
TransformXml
태스크를 AfterBuild 대상에 할당합니다.여기 보시면 제가 변화를 가져올 것입니다.web.base.config
을web.[configuration].config
그리고 그것은 그것을 저장할 것입니다.web.config
자세한 내용은 이 Microsoft Q&A를 참조하십시오. 빌드를 확장하는 방법은 여기를 참조하십시오.
옵션 2:
이 답변을 바탕으로 간단한 콘솔 앱 TransformConfig.exe(C# 6.0 구문)를 개발했습니다.
using System;
using System.Linq;
using Microsoft.Web.XmlTransform;
namespace TransformConfig
{
class Program
{
static int Main(string[] args)
{
var myDocumentsFolder = $@"C:\Users\{Environment.UserName}\Documents";
var myVsProjects = $@"{myDocumentsFolder}\Visual Studio 2015\Projects";
string srcConfigFileName = "Web.config";
string tgtConfigFileName = srcConfigFileName;
string transformFileName = "Web.Debug.config";
string basePath = myVsProjects + @"\";
try
{
var numArgs = args?.Count() ?? 0;
if (numArgs == 0 || args.Any(x=>x=="/?"))
{
Console.WriteLine("\nTransformConfig - Usage:");
Console.WriteLine("\tTransformConfig.exe /d:tgtConfigFileName [/t:transformFileName [/s:srcConfigFileName][/b:basePath]]");
Console.WriteLine($"\nIf 'basePath' is just a directory name, '{basePath}' is preceeded.");
Console.WriteLine("\nTransformConfig - Example (inside PostBuild event):");
Console.WriteLine("\t\"c:\\Tools\\TransformConfig.exe\" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config /b:\"$(ProjectDir)\\\"");
Environment.ExitCode = 1;
return 1;
}
foreach (var a in args)
{
var param = a.Trim().Substring(3).TrimStart();
switch (a.TrimStart().Substring(0,2).ToLowerInvariant())
{
case "/d":
tgtConfigFileName = param ?? tgtConfigFileName;
break;
case "/t":
transformFileName = param ?? transformFileName;
break;
case "/b":
var isPath = (param ?? "").Contains("\\");
basePath = (isPath == false)
? $@"{myVsProjects}\" + param ?? ""
: param;
break;
case "/s":
srcConfigFileName = param ?? srcConfigFileName;
break;
default:
break;
}
}
basePath = System.IO.Path.GetFullPath(basePath);
if (!basePath.EndsWith("\\")) basePath += "\\";
if (tgtConfigFileName != srcConfigFileName)
{
System.IO.File.Copy(basePath + srcConfigFileName,
basePath + tgtConfigFileName, true);
}
TransformConfig(basePath + tgtConfigFileName, basePath + transformFileName);
Console.WriteLine($"TransformConfig - transformed '{basePath + tgtConfigFileName}' successfully using '{transformFileName}'.");
Environment.ExitCode = 0;
return 0;
}
catch (Exception ex)
{
var msg = $"{ex.Message}\nParameters:\n/d:{tgtConfigFileName}\n/t:{transformFileName}\n/s:{srcConfigFileName}\n/b:{basePath}";
Console.WriteLine($"TransformConfig - Exception occurred: {msg}");
Console.WriteLine($"TransformConfig - Processing aborted.");
Environment.ExitCode = 2;
return 2;
}
}
public static void TransformConfig(string configFileName, string transformFileName)
{
var document = new XmlTransformableDocument();
document.PreserveWhitespace = true;
document.Load(configFileName);
var transformation = new XmlTransformation(transformFileName);
if (!transformation.Apply(document))
{
throw new Exception("Transformation Failed");
}
document.Save(configFileName);
}
}
}
DLL을 ."C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
이2015에 되며, 버전의 ""(" VS 2015", "" ")를 교체합니다.v14.0
경로(예: 버경표로시에됩다니로호번전적한절▁by다▁path▁in니▁the표).v11.0
).
Visual Studio 2017의 경우 경로의 이름 지정 스키마가 변경되었습니다.예를 들어 엔터프라이즈 버전의 경우 다음과 같습니다.C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
전문가용 버전의 경우 교체해야 합니다.Enterprise
Professional
미리 보기 버전을 사용하는 경우 추가로 바꾸기2017
타고Preview
.
Studio의 에 대해 에 대한 에는 Visual Studio " ("Visual Studio " " " " (엔터프라이즈 " " " " 를 해야 할 도 있습니다).Enterprise
타고Professional
경로 내):
VS 버전의 경우)
Microsoft.Web.XmlTransform.dll
)
2015C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web
2017C:\Program Files (x86)\Microsoft Visual Studio\2017\
Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
2019C:\Program Files (x86)\Microsoft Visual Studio\2019\
Enterprise\MSBuild\Microsoft\VisualStudio\v16.0\Web
후를 들어 .exe 파일을 저장합니다.C:\MyTools\
.
용도: 빌드 후 이벤트에서 사용할 수 있습니다(프로젝트 속성에서 빌드 이벤트를 선택한 다음 빌드 후 이벤트 명령줄 편집).명령줄 매개 변수는 다음과 같습니다(예).
"C:\MyTools\TransformConfig.Exe" /d:Web.config /t:웹.$(구성 이름).config /s:Web.Template.config /b:"$(ProjectDir)\"
즉, 구성 파일의 이름, 변환 구성 파일, 선택적 템플릿 구성, 두 파일을 포함하는 프로젝트의 경로가 차례로 표시됩니다.
그렇지 않으면 원래 전체 구성이 변환에 의해 덮어쓰게 되므로 템플릿 구성 매개 변수(옵션)를 추가했습니다. 이 매개 변수는 템플릿을 제공하여 피할 수 있습니다.
원본 Web.config를 복사하여 템플릿을 만들고 이름을 Web으로 지정합니다.Template.config.
참고:
▁the▁다▁if있▁also니▁you습▁can수를 복사할 수도 있습니다.
TransformConfig.exe
. 서 Visual Studio 경로는 다음과 같습니다.Microsoft.Web.XmlTransform.dll
상주하며 구성을 변환해야 하는 모든 프로젝트에서 참조합니다.제가 왜 추가했는지 궁금해하시는 분들을 위해.
Environment.ExitCode = x;
할당: 메인에서 int를 반환하는 것만으로는 빌드 이벤트에 도움이 되지 않습니다.자세한 내용은 여기를 참조하십시오.프로젝트를 게시하고 웹을 사용하는 경우.Template.config는 게시하기 전에 올바른 구성(일반적으로 릴리스)으로 솔루션을 재구성했는지 확인합니다.그 이유는 웹 때문입니다.디버깅하는 동안 구성을 덮어쓰므로 그렇지 않으면 잘못된 파일을 변환할 수 있습니다.
Web.debug.config를 Web.debug.config로 변환하려면 변환 효과를 어디에 저장해야 합니까?라는 문제가 발생하기 때문에 질문에 대답하는 것은 간단하지 않습니다.Web.config 자체에서?이렇게 하면 변환 원본 파일을 덮어씁니다!아마도 Visual Studio가 빌드 중에 변환을 수행하지 않는 이유일 것입니다.
이전 Matt 답변은 유효하지만 실제 활성 솔루션 구성을 디버그에서 릴리스로 변경할 때 작동하는 일반 솔루션을 사용하도록 이러한 답변을 혼합할 수 있습니다.간단한 솔루션은 다음과 같습니다.
- 구성(디버그, 릴리스 등)에 대한 구성 변환 생성
- 이름 바꾸기
Web.config
을 로다철하에 합니다.Web.base.config
에 따라 자동으로 을 변경해야 .Web.base.Debug.config
계속) - 다음 transformWebConfig.proj XML 파일을 프로젝트 폴더에 추가합니다.
<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" DefaultTargets="TransformWebConfig" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="TransformWebConfig">
<TransformXml Source="Web.base.config" Transform="Web.base.$(CurrentConfig).config" Destination="Web.config" />
</Target>
</Project>
- 프로젝트 속성으로 이동하여 Build Events(이벤트 빌드)를 선택하고 Post-Build event(빌드 후 이벤트) 명령줄에 다음 내용을 추가합니다.
@if exist "%ProgramFiles(x86)%\MSBuild\12.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\12.0\bin;%PATH%
msbuild $(ProjectDir)transformWebConfig.proj /t:TransformWebConfig /p:CurrentConfig=$(ConfigurationName) /p:TargetProjectName=$(TargetPath)
이제 솔루션을 구축하면 활성 구성에 대한 유효한 변환이 포함된 Web.config 파일이 생성됩니다.
VS 2017의 경우 매우 인기 있는 솔루션인 것 같은데 왜 아무도 위에서 언급하지 않았는지 잘 모르겠습니다.아주 쉽습니다.2019년 3월 5일 VS 2017 및 모든 버전에서 작동하도록 만든 Iorrlandoni의 댓글을 반드시 보십시오.
기본적으로 두 단계로 되어 있습니다.먼저 아래 코드를 추가하여 .csproj 파일을 편집합니다.두 번째로, 새 web.base.config 구성을 생성하고 기존 web.config를 여기에 복사합니다.이 작업을 수행하면 원하는 변환으로 web.config를 덮어씁니다.
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />
<Target Name="BeforeBuild">
<TransformXml Source="Web.Base.config"
Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
귀하의 즉각적인 질문에 답변했습니다. 즉, 변환은 빌드가 아닌 게시에 적용된다는 설명입니다.
하지만, 저는 그것이 여러분이 하고 싶은 것을 성취하는 방법에 대한 해결책을 제공하지 않는다고 생각합니다.
web.config를 깨끗하게 유지하고 각 변환 파일의 환경에 따라 달라지는 모든 키를 설정하는 방법을 찾느라 며칠 동안 이 정확한 문제와 씨름하고 있습니다.결론적으로 가장 쉽고 안정적인 해결책은 원래 web.config에서 디버그 값을 사용하는 것입니다. Visual Studio에서 디버그를 실행할 때 디버그 값이 항상 표시됩니다.
그런 다음 테스트, 통합, 프로덕션 등의 게시할 다양한 환경에 대한 변환을 만듭니다.게시 시 web.config 파일을 변환할 수 있는 내장 기능으로 충분합니다.SlowCheetah 또는 빌드 이벤트 또는 프로젝트 파일을 편집할 필요가 없습니다.만약 당신이 웹 프로젝트만 가지고 있다면 그것은.
원하는 경우 web.debug.config 파일을 사용하여 개발 환경과 관련된 모든 값을 가진 별도의 파일을 유지할 수도 있습니다.Visual Studio에서 실행할 때는 값이 적용되지 않는다는 점을 설명해야 합니다. 다른 사용자가 Visual Studio를 사용하려고 할 경우를 대비하여!
빌드 시간에 변환을 수행하려면 다음을 수행합니다.
프로젝트에서 web.config(+web.*.config)를 제외합니다.그런 다음 디스크의 파일 이름을 다음과 같이 변경합니다.
- web.config => Web.Template.config
- web.Release.config => Web.변신.Release.config
- web.debug.config => Web.변신.debug.config
gitignore에 web.config를 추가하고 지금까지의 변경 사항을 커밋합니다.
마지막으로 텍스트 편집기에서 프로젝트 파일에 다음을 추가합니다.
<Target Name="BeforeBuild">
<TransformXml Source="Web.Template.config" Transform="Web.Transform.$(Configuration).config" Destination="Web.config" />
</Target>
<ItemGroup>
<Content Include="Web.config" />
<None Include="Web.*.config" />
</ItemGroup>
이제 여러분이 프로젝트를 만들 때마다 웹이 있습니다.Template.config는 웹에서 변환됩니다.Visual Studio에서 디버그 구성을 선택한 경우 debug.Transform.config를 Web.config로 변환합니다.릴리스도 마찬가지입니다.
Web.config가 처음 생성되면 빌드 후 Visual Studio를 다시 시작한 다음 Visual Studio가 생성된 web.config를 인식하도록 다시 빌드해야 할 수 있습니다.
이 접근 방식은 ASP를 사용하여 테스트되었습니다.Visual Studio 2019에서 NET(코어가 아님) 프로젝트.
최근 에 기반한 이전 web.config 파일에서도 동일한 문제가 발생했습니다.NET Framework 2.0.솔루션은 web.config의 네임스페이스(구성 루트 노드에서 xmlns 속성)를 제거하는 것이었습니다.
하기 전:<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
이후:<configuration>
Visual Studio 2015의 확장 버전이 있는 것 같습니다.
https://visualstudiogallery.msdn.microsoft.com/05bb50e3-c971-4613-9379-acae2cfe6f9e
이 패키지를 사용하면 빌드 구성을 기반으로 app.config 또는 기타 XML 파일을 변환할 수 있습니다.
Octopus Deploy(Community Edition은 무료)를 사용하여 다음과 같은 이점을 제공합니다.web.config
널 위해서.단계:
- 웹 응용 프로그램을 배포하도록 Octopus 설정
- 다음 항목을 확인합니다.
Web.Release.config
을 가지고 있습니다.Build Action
이 에설된재로 되었습니다.Content
의 메인 꼭당의메인처럼신▁your처럼.web.config
java.
바로 그거야!나머지는 특별한 구성 없이 문어가 할 것입니다.기본 IIS 웹 사이트 배포는 즉시 이 작업을 수행합니다.
앱 설정 "xdt:Transform="Replace" 특성.아래와 같이:
<appSettings xdt:Transform="Replace">
<add key="SMTPPort" value="58" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>
전체 앱 설정을 디버그 구성으로 바꿉니다.하지만 당신이 원하지 않는다면 당신이 원하는 태그를 적용할 수 있습니다.이 태그에는 해당 태그의 모든 하위 요소가 포함됩니다.참고로 구성 섹션에도 속성을 설정해야 합니다.아래에 표시합니다.
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
언급URL : https://stackoverflow.com/questions/8841075/web-config-transform-not-working
'programing' 카테고리의 다른 글
상위 100% 선택을 사용하는 이유는 무엇입니까? (0) | 2023.05.05 |
---|---|
파이썬의 for 루프에서 "통과"와 "계속" 사이에 차이가 있습니까? (0) | 2023.05.05 |
Xcode DMG 또는 XIP 파일을 다운로드하는 방법은 무엇입니까? (0) | 2023.05.05 |
NuGet의 패키지 위치를 변경할 수 있습니까? (0) | 2023.05.05 |
WPF 창에서 외부 앱 호스팅 (0) | 2023.05.05 |