Rất tiếc, Visual Studio (2010 - 2019) không hỗ trợ trực tiếp nó khi bạn đang gỡ lỗi, nó chỉ dành cho xuất bản - ngay cả với phần mở rộng SlowCheetah (câu trả lời được đánh dấu) nó không hoạt động đối với tôi (chỉ dành cho các dự án sử dụng app.config hơn là web.config).
Lưu ý rằng có một cách giải quyết được mô tả tại codeproject .
Nó mô tả cách sửa đổi tệp .msproj để ghi đè lên web.config hiện tại bằng phiên bản đã chuyển đổi.
Trước tiên, tôi sẽ mô tả cách giải quyết đó là Tùy chọn 1 , nhưng gần đây tôi đã phát hiện ra một Tùy chọn 2 khác , dễ sử dụng hơn (vì vậy bạn có thể cuộn xuống tùy chọn 2 trực tiếp nếu muốn):
Tùy chọn 1: Tôi đã thêm các hướng dẫn lấy từ bài viết codeproject gốc (xem liên kết ở trên), vì ảnh chụp màn hình ở đó đã biến mất và tôi không muốn mất toàn bộ thông tin:
VS.Net không thực hiện bất kỳ chuyển đổi nào khi bạn đang phát triển và chỉ gỡ lỗi môi trường cục bộ của bạn. Nhưng có một số bước bạn có thể làm để điều này xảy ra nếu bạn muốn.
- Đầu tiên, hãy tạo các cấu hình bạn muốn trong VS.Net , giả sử rằng bản gỡ lỗi và bản phát hành mặc định không đủ cho những gì bạn đang cố gắng thực hiện.
- Nhấp chuột phải vào của bạn
web.config
và chọn Add Config Transforms - thao tác này sẽ tạo một cấu hình chuyển đổi phụ thuộc cho từng cấu hình của bạn đã xác định.
- Bây giờ bạn có thể đổi tên
web.config
thành web.base.config
.
- Thêm một
web.config
vào dự án của bạn. Nó không quan trọng những gì có trong nó bởi vì nó sẽ bị ghi đè mỗi lần chúng tôi làm một xây dựng nhưng chúng tôi muốn nó là một phần của dự án để VS.Net không cho chúng ta những "dự án của bạn không được cấu hình cho Debugging" pop- lên.
- Chỉnh sửa
.csproj
tệp dự án của bạn và thêm TransformXml
nhiệm vụ sau vào mục tiêu AfterBuild. Ở đây bạn có thể thấy tôi sẽ chuyển đổi web.base.config
tệp bằng cách sử dụng web.[configuration].config
và nó sẽ lưu nó dưới dạng web.config
. Để biết chi tiết, vui lòng kiểm tra phần Hỏi & Đáp này của Microsoft và để biết hướng dẫn cách mở rộng bản dựng, hãy xem ở đó .
Lựa chọn 2:
Dựa trên câu trả lời này , tôi đã phát triển một ứng dụng console đơn giản, TransformConfig.exe (theo cú pháp 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);
}
}
}
Đảm bảo rằng bạn thêm DLL "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
làm tham chiếu (ví dụ này áp dụng cho VS 2015, đối với các phiên bản cũ hơn thay thế v14.0
đường dẫn trong đường dẫn bằng số phiên bản thích hợp, ví dụ v11.0
:).
Đối với Visual Studio 2017, các lược đồ đặt tên cho con đường đã thay đổi: Ví dụ, đối với phiên bản doanh nghiệp nó là ở đây: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Web
.
Tôi giả định rằng đối với phiên bản chuyên nghiệp, bạn cần thay thế Enterprise
trong đường dẫn bằng Professional
. Nếu bạn đang sử dụng phiên bản xem trước, hãy thay thế 2017
bằng Preview
.
Dưới đây là tổng quan về cách đường dẫn đã thay đổi đối với các phiên bản Visual Studio khác nhau (nếu bạn không có phiên bản Enterprise, bạn có thể cần phải thay thế Enterprise
bằng Professional
trong đường dẫn):
Đường dẫn Microsoft.Web.XmlTransform.dll
phiên bản VS (cho )
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
Biên dịch nó và đặt tệp .exe vào một thư mục, ví dụ C:\MyTools\
.
Cách sử dụng:
Bạn có thể sử dụng nó trong sự kiện xây dựng bài đăng của mình (trong thuộc tính dự án , chọn Tạo sự kiện , sau đó chỉnh sửa dòng lệnh Sự kiện sau xây dựng ). Các tham số dòng lệnh là (ví dụ):
"C: \ MyTools \ TransformConfig.Exe" /d:Web.config /t:Web.$(ConfigurationName).config /s:Web.Template.config / b: "$ (ProjectDir) \"
tức là đầu tiên là tên của tệp cấu hình, tiếp theo là tệp cấu hình biến đổi, tiếp theo là cấu hình mẫu tùy chọn, tiếp theo là đường dẫn đến dự án của bạn chứa cả hai tệp.
Tôi đã thêm thông số cấu hình mẫu tùy chọn vì nếu không, cấu hình hoàn chỉnh ban đầu của bạn sẽ bị ghi đè bởi biến đổi, điều này có thể tránh được bằng cách cung cấp mẫu.
Tạo mẫu chỉ cần sao chép Web.config gốc và đặt tên là Web.Template.config.
Ghi chú:
Nếu muốn, bạn cũng có thể sao chép TransformConfig.exe
tệp vào đường dẫn Visual Studio được đề cập ở trên nơi tệp đó Microsoft.Web.XmlTransform.dll
cư trú và tham chiếu đến tệp đó trong tất cả các dự án của bạn nơi bạn cần chuyển đổi cấu hình của mình.
Đối với những người trong số các bạn đang thắc mắc tại sao tôi thêm các Environment.ExitCode = x;
bài tập: Việc chỉ trả lại một int từ Main không giúp ích gì trong sự kiện xây dựng. Xem chi tiết tại đây.
Nếu bạn đang xuất bản dự án của mình và bạn đang sử dụng Web.Template.config, hãy đảm bảo rằng bạn đã xây dựng lại giải pháp của mình với cấu hình phù hợp (thường là Bản phát hành) trước khi xuất bản. Nguyên nhân là do Web.Config bị ghi đè trong quá trình gỡ lỗi và nếu không thì bạn có thể chuyển đổi tệp sai.