Visual Studio (2010 - 2019)ไม่น่าเสียดายที่ไม่ได้สนับสนุนโดยตรงขณะที่คุณกำลังแก้ไขข้อบกพร่องได้มีไว้เพียงสำหรับการเผยแพร่ - แม้จะมีการขยาย SlowCheetah (คำตอบที่ถูกทำเครื่องหมาย) มันไม่ทำงานสำหรับฉัน (เฉพาะโครงการที่ใช้ app.config มากกว่า web.config)
หมายเหตุว่ามีวิธีแก้ปัญหาที่ อธิบายไว้ที่ codeproject
อธิบายวิธีการแก้ไขไฟล์. msproj เพื่อเขียนทับ web.config ปัจจุบันด้วยเวอร์ชันที่แปลงแล้ว
ก่อนอื่นฉันจะอธิบายวิธีแก้ปัญหานั้นว่าเป็นตัวเลือกที่ 1แต่เมื่อเร็ว ๆ นี้ฉันได้ค้นพบตัวเลือกอื่นที่2ซึ่งใช้งานง่ายกว่า (ดังนั้นคุณสามารถเลื่อนลงไปที่ตัวเลือก 2 ได้โดยตรงหากต้องการ):
ตัวเลือกที่ 1:ฉันได้เพิ่มคำแนะนำที่นำมาจากบทความ codeprojectดั้งเดิม(ดูลิงก์ด้านบน) เนื่องจากภาพหน้าจอนั้นหายไปแล้วและฉันไม่ต้องการสูญเสียข้อมูลทั้งหมด:
VS.Net ไม่ทำการเปลี่ยนแปลงใด ๆ เมื่อคุณกำลังพัฒนาและเพียงแค่ดีบักสภาพแวดล้อมในพื้นที่ของคุณ แต่มีบางขั้นตอนที่คุณสามารถทำได้เพื่อให้สิ่งนี้เกิดขึ้นหากคุณต้องการ
- ขั้นแรกให้สร้างการกำหนดค่าที่คุณต้องการในVS.Netโดยสมมติว่าการดีบักเริ่มต้นและรีลีสไม่เพียงพอสำหรับสิ่งที่คุณพยายามทำ
- คลิกขวาที่คุณ
web.config
และเลือกเพิ่มการแปลงการกำหนดค่า - สิ่งนี้จะสร้างการกำหนดค่าการแปลงขึ้นอยู่กับการกำหนดค่าของคุณที่กำหนดไว้
- ตอนนี้คุณสามารถเปลี่ยนชื่อของคุณจะ
web.config
web.base.config
- เพิ่ม
web.config
ในโครงการของคุณ ไม่สำคัญว่าจะมีอะไรอยู่ในนั้นเพราะจะถูกเขียนทับทุกครั้งที่เราสร้าง แต่เราต้องการให้เป็นส่วนหนึ่งของโครงการดังนั้นVS.Netจึงไม่ให้ป๊อปอัป"โครงการของคุณไม่ได้กำหนดค่าสำหรับการแก้จุดบกพร่อง"ขึ้น.
- แก้ไข
.csproj
ไฟล์โครงการของคุณและเพิ่มTransformXml
งานต่อไปนี้ในเป้าหมาย AfterBuild ที่นี่คุณจะเห็นว่าฉันจะเปลี่ยนweb.base.config
ไฟล์โดยใช้ไฟล์web.[configuration].config
และจะบันทึกเป็นweb.config
ไฟล์. สำหรับรายละเอียดโปรดตรวจสอบนี้ไมโครซอฟท์ 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"
เป็นข้อมูลอ้างอิง (ตัวอย่างนี้ใช้กับ VS 2015 สำหรับเวอร์ชันที่เก่ากว่าแทนที่v14.0
ในพา ธ ด้วยหมายเลขเวอร์ชันที่เหมาะสมเช่นv11.0
)
สำหรับVisual Studio 2017,แผนการตั้งชื่อสำหรับเส้นทางที่มีการเปลี่ยนแปลง: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
ตัวอย่างเช่นสำหรับรุ่นองค์กรก็อยู่ที่นี่:
ฉันคิดว่าสำหรับรุ่นมืออาชีพที่คุณจำเป็นต้องเปลี่ยนในเส้นทางโดยEnterprise
Professional
หากคุณกำลังใช้รุ่นแสดงตัวอย่างนอกจากนี้แทนที่โดย2017
Preview
นี่คือภาพรวมว่าเส้นทางที่มีการเปลี่ยนแปลงสำหรับรุ่นที่แตกต่างกันของ Visual Studio (ถ้าคุณไม่ได้มีรุ่น Enterprise คุณอาจจำเป็นต้องเปลี่ยนEnterprise
โดยProfessional
ในเส้นทาง):
VS เวอร์ชัน Path (สำหรับMicrosoft.Web.XmlTransform.dll
)
2015 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web
2017 C:\Program Files (x86)\Microsoft Visual Studio\2017\
Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
2019 C:\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:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
เช่นชื่อแรกของไฟล์ config ตามด้วยไฟล์ config แปลงตามด้วยการกำหนดค่าเทมเพลตที่เป็นทางเลือกตามด้วยพา ธ ไปยังโครงการของคุณที่มีทั้งสองไฟล์
ฉันได้เพิ่มพารามิเตอร์การกำหนดค่าเทมเพลตที่เป็นทางเลือกเพราะมิฉะนั้นการกำหนดค่าเดิมที่สมบูรณ์ของคุณจะถูกเขียนทับโดยการแปลงซึ่งสามารถหลีกเลี่ยงได้โดยการให้เทมเพลต
สร้างเทมเพลตโดยเพียงแค่คัดลอก Web.config ดั้งเดิมแล้วตั้งชื่อว่า Web.Template.config
บันทึก:
หากคุณต้องการคุณสามารถคัดลอกTransformConfig.exe
ไฟล์ไปยังพา ธ Visual Studio ที่กล่าวถึงข้างต้นซึ่งไฟล์นั้นMicrosoft.Web.XmlTransform.dll
อยู่และอ้างถึงในโปรเจ็กต์ทั้งหมดของคุณที่คุณต้องการเปลี่ยนคอนฟิกของคุณ
สำหรับพวกคุณที่สงสัยว่าทำไมฉันจึงเพิ่มEnvironment.ExitCode = x;
งาน: การส่งคืน int จาก Main ไม่ได้ช่วยในเหตุการณ์สร้าง ดูรายละเอียดที่นี่
หากคุณกำลังเผยแพร่โปรเจ็กต์ของคุณและคุณกำลังใช้ Web.Template.config ตรวจสอบให้แน่ใจว่าคุณได้สร้างโซลูชันของคุณขึ้นมาใหม่ด้วยการกำหนดค่าที่ถูกต้อง (โดยปกติคือ Release) ก่อนที่คุณจะเผยแพร่ สาเหตุก็คือ Web.Config ถูกเขียนทับระหว่างการดีบักและคุณอาจเปลี่ยนไฟล์ผิดเป็นอย่างอื่น