วิธีแก้ปัญหาสำหรับไฟล์ web.config และ Visual Studio 2010:
1) แก้ไขไฟล์. csproj เว็บของคุณด้วยตนเองเพื่อเพิ่มAfterBuild
Target ดังนี้:
<Project>
...
<Target Name="AfterBuild">
<Copy SourceFiles="web.config" DestinationFiles="obj\$(Configuration)\tempweb.config" />
<TransformXml Source="obj\$(Configuration)\tempweb.config"
Transform="web.$(USERNAME).config"
Destination="obj\$(Configuration)\tempweb2.config" />
<ReadLinesFromFile File="obj\$(Configuration)\tempweb2.config"><Output TaskParameter="Lines" ItemName="TransformedWebConfig"/></ReadLinesFromFile>
<ReadLinesFromFile File="web.config"><Output TaskParameter="Lines" ItemName="UnTransformedWebConfig"/></ReadLinesFromFile>
<Copy Condition=" @(UnTransformedWebConfig) != @(TransformedWebConfig) " SourceFiles="obj\$(Configuration)\tempweb2.config" DestinationFiles="web.config" OverwriteReadOnlyFiles="True" />
</Target>
</Project>
เป้าหมายนี้จะแปลงไฟล์ Web.config ที่สอดคล้องกับนักพัฒนาปัจจุบันที่ล็อกอิน - ด้วยเหตุนี้$(USERNAME)
ตัวแปร - โดยสร้างไฟล์ที่เกี่ยวข้องใน 1) มันจะแทนที่ Web.config ภายในเครื่องก็ต่อเมื่อเนื้อหามีการเปลี่ยนแปลง (เพื่อหลีกเลี่ยงการรีสตาร์ท) ในแต่ละบิลด์แม้ว่า Web.config ในเครื่องจะถูกควบคุมด้วยแหล่งที่มานั่นคือสาเหตุที่มีการ OverwriteReadOnlyFiles
ตั้งค่าเป็น True ประเด็นนี้ในความเป็นจริงเป็นที่ถกเถียงกัน
2) สร้างไฟล์ที่ตั้งชื่อWeb.[developer windows login].config
สำหรับนักพัฒนาแต่ละคนในโครงการ (ตัวอย่างเช่นในภาพหน้าจอต่อไปนี้ฉันมีนักพัฒนาสองคนชื่อ smo และ smo2):
ไฟล์เหล่านี้ (1 ต่อผู้พัฒนา) สามารถ / ควรได้รับการควบคุมแหล่งที่มา ไม่ควรทำเครื่องหมายว่าขึ้นอยู่กับ Web.config หลักเนื่องจากเราต้องการตรวจสอบทีละรายการ
แต่ละไฟล์นี้แสดงถึงการแปลงเพื่อใช้กับไฟล์ Web.Config หลัก ไวยากรณ์การเปลี่ยนแปลงอธิบายไว้ที่นี่: Web.config ไวยากรณ์การเปลี่ยนแปลงสำหรับแอพลิเคชันโครงการการปรับใช้เว็บ เรานำภารกิจการแปลงไฟล์ Xml ที่ยอดเยี่ยมนี้มาใช้ใหม่พร้อมกับ Visual Studio วัตถุประสงค์ของงานนี้คือผสานองค์ประกอบ Xml และแอตทริบิวต์แทนการเขียนทับไฟล์ทั้งหมด
ตัวอย่างเช่นนี่คือตัวอย่าง web.[dev login].config
ที่เปลี่ยนสตริงการเชื่อมต่อชื่อ 'MyDB' โดยไม่คำนึงถึงส่วนที่เหลือของไฟล์ Web.config:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
</connectionStrings>
</configuration>
ตอนนี้วิธีนี้ไม่สมบูรณ์แบบเนื่องจาก:
- หลังจากสร้างแล้วนักพัฒนาอาจมี Web.Config ในเครื่องที่แตกต่างจากระบบควบคุมแหล่งที่มา
- พวกเขาอาจต้องบังคับให้เขียนภายในเครื่องเมื่อได้รับ Web.Config ใหม่จากระบบควบคุมแหล่งที่มา
- นักพัฒนาไม่ควรเช็คเอาต์ / ใน web.config หลัก ควรสงวนไว้สำหรับคนไม่กี่คน
แต่อย่างน้อยคุณต้องรักษา web.config หลักที่ไม่ซ้ำใครพร้อมไฟล์การแปลงหนึ่งไฟล์ต่อผู้พัฒนา
อาจใช้วิธีการที่คล้ายกันสำหรับไฟล์ App.config (ไม่ใช่เว็บ) แต่ฉันไม่ได้อธิบายเพิ่มเติม