ผู้พัฒนาเฉพาะไฟล์ app.config / web.config ใน Visual Studio


93

เรามีโครงการ. NET หลายโครงการที่เก็บการตั้งค่าบางอย่างไว้ในไฟล์การกำหนดค่า

ตอนนี้นักพัฒนาแต่ละรายจะมีไฟล์คอนฟิกูเรชันของตัวเองที่แตกต่างกันเล็กน้อย (สตริงการเชื่อมต่อที่แตกต่างกันเพื่อเชื่อมต่อกับฐานข้อมูลในเครื่องแตกต่างกัน จุดสิ้นสุดWCF ที่ฯลฯ )

ในขณะนี้เรามักจะตรวจสอบไฟล์ app / web.config และแก้ไขให้เหมาะสมกับความต้องการของเรา

นำไปสู่การนี้ไปสู่ปัญหามากมายตั้งแต่เวลาผ่านไปคนที่จะตรวจสอบในการตั้งค่าของตัวเองหรือการกำหนดค่าที่กำหนดเองหลวมเมื่อได้รับรุ่นล่าสุดจากTFS

คุณรับมือกับสถานการณ์เช่นนี้อย่างไร? หรือคุณไม่มีปัญหานี้เลย?


10
ฉันกำลังโหวตให้เปิดอีกครั้งเนื่องจากปัญหานี้เป็นปัญหาทั่วไปสำหรับนักพัฒนา Visual Studio และเกี่ยวข้องโดยตรงกับเครื่องมือที่นักพัฒนาใช้อยู่ (ด้วยเหตุนี้ผลโหวต)
Christian Gollhardt

เห็นด้วยนี่เป็นปัญหาที่เกิดขึ้นอย่างต่อเนื่องเนื่องจากขนาดทีมของเราเติบโตขึ้นและความพยายามในการแก้ไขหลายครั้งไม่เป็นที่น่าพอใจ
DiskJunky

คำตอบ:


66

เราใช้ระบบที่รวมคำตอบที่มีอยู่หลายคำตอบไว้ในหน้านี้รวมทั้งใช้คำแนะนำนี้โดย Scott HanselmanHanselman

ในระยะสั้นสิ่งที่เราทำคือการมี app.config / web.config ทั่วไปและมีการตั้งค่าเฉพาะส่วนใหญ่ในแต่ละไฟล์ตามที่คำตอบอื่น ๆ แนะนำไว้ที่นี่ เช่นสำหรับการตั้งค่า SMTP ของเรา app.config ประกอบด้วย

<system.net>
  <mailSettings>
    <smtp configSource="config\smtp.config" />
  </mailSettings>
</system.net>

ไฟล์นี้อยู่ในการควบคุมแหล่งที่มา อย่างไรก็ตามไฟล์แต่ละไฟล์เช่นนี้ไม่ใช่:

<?xml version="1.0" encoding="utf-8" ?>
<smtp deliveryMethod="Network">
  <network host="127.0.0.1" port="25" defaultCredentials="false" password="" userName ="" />
</smtp>

นั่นไม่ใช่เรื่องที่จบลง แล้วนักพัฒนาใหม่หรือการติดตั้งใหม่ การกำหนดค่าจำนวนมากไม่ได้อยู่ในการควบคุมแหล่งที่มาอีกต่อไปและเป็นเรื่องยากที่จะสร้างไฟล์. config ทั้งหมดที่ต้องการด้วยตนเอง ฉันชอบที่จะมีแหล่งที่มาที่อย่างน้อยจะรวบรวมได้ทันที

ดังนั้นเราจึงเก็บเวอร์ชันของไฟล์. config ไว้ในการควบคุมแหล่งที่มาชื่อไฟล์. config.default ต้นไม้แหล่งสดจึงมีลักษณะดังนี้:

ข้อความแสดงแทน

ถึงกระนั้นก็ไม่ได้ใช้ประโยชน์ใด ๆ สำหรับนักพัฒนาเนื่องจาก Visual Studio เป็นเพียงไฟล์ข้อความที่ไม่มีความหมาย ดังนั้นไฟล์แบตช์copy_default_config.batจะดูแลการสร้างชุดเริ่มต้นของไฟล์. config จากไฟล์. config.default:

@echo off
@REM Makes copies of all .default files without the .default extension, only if it doesn't already exist. Does the same recursively through all child folders.
for /r %%f in (*.default) do (
    if not exist "%%~pnf" (echo Copying %%~pnf.default to %%~pnf & copy "%%f" "%%~pnf" /y)
)
echo Done.

สคริปต์สามารถรันซ้ำได้อย่างปลอดภัยโดยที่นักพัฒนาที่มีไฟล์. config อยู่แล้วจะไม่มีการเขียนทับ ดังนั้นเราสามารถเรียกใช้ไฟล์แบตช์นี้เป็นเหตุการณ์ที่สร้างไว้ล่วงหน้า ค่าในไฟล์. default อาจไม่ถูกต้องสำหรับการติดตั้งใหม่ แต่เป็นจุดเริ่มต้นที่สมเหตุสมผล

ท้ายที่สุดสิ่งที่นักพัฒนาแต่ละคนลงเอยด้วยโฟลเดอร์ของไฟล์ config ที่มีลักษณะดังนี้:

ข้อความแสดงแทน

มันอาจดูซับซ้อนเล็กน้อย แต่แน่นอนว่าดีกว่าสำหรับความยุ่งยากของนักพัฒนาที่เหยียบนิ้วเท้าของกันและกัน


ทำไมไม่มี. config หลักโดยตรงในที่เก็บ แต่ไม่ใช่แต่ละตัว?
Graffic

6
ช่างน่าปวดหัวเราต้องการทางออกที่ดีกว่านี้ ฉันมีวิธีการที่คล้ายกันในการตั้งค่าและเบื่อที่มันเปราะบางมากและยังต้องการคำอธิบายให้กับนักพัฒนารายใหม่
jpierson

@Gavin ฉันได้รับข้อผิดพลาดหากพยายามเรียกใช้ไฟล์ bat ที่คุณระบุไว้: '∩╗┐ @ echo' ไม่รู้จักว่าเป็นคำสั่งภายในหรือภายนอกโปรแกรมที่ใช้งานได้หรือไฟล์แบตช์
Austin

2
@Austin ดูเหมือนว่าคุณจะมีขยะที่ไม่สามารถพิมพ์ได้ก่อนหน้า "@echo" ซึ่งเป็นไปได้ว่าเครื่องหมายคำสั่ง Unicode byte เป็นไปได้หรือไม่? อาจมีบางอย่างผิดพลาดในการคัดลอก / วางหรือไฟล์แบตช์จะถูกบันทึกในการเข้ารหัสที่ไม่สามารถอ่านได้อย่างถูกต้อง
Gavin

21

ใน Web.config ของคุณใช้ซอร์สจากไฟล์อื่น

<configuration>
    <connectionStrings configSource="ConnectionStrings.config" />
...
</configuration>

ให้ web.config อยู่ในการควบคุมเวอร์ชันและอย่าทำสำหรับ ConnectionStrings.config ตอนนี้นักพัฒนาทั้งหมดมีไฟล์เดียวสำหรับสตริงการเชื่อมต่อ

คุณสามารถทำได้สำหรับการตั้งค่าทั้งหมดที่ขึ้นอยู่กับท้องถิ่น


1
สิ่งนี้ได้ผลดีสำหรับฉัน ดูเพิ่มเติมที่: davidgiard.com/2012/05/25/… ไฟล์ ConnectionStrings.config จะต้องอยู่ในโฟลเดอร์เดียวกับการกำหนดค่าแอปหรือเว็บ นอกจากนี้คุณต้องเปลี่ยนคุณสมบัติเป็น 'copy if newer' เพื่อส่งออก และไฟล์ ConnectionStrings.config ต้องการส่วนเต็มที่มีองค์ประกอบเปิดและปิด คุณต้องตั้งค่าการควบคุมเวอร์ชันเพื่อละเว้นไฟล์เพื่อให้แต่ละไฟล์มีความเฉพาะเจาะจงกับผู้ใช้
Jeffrey Roughgarden

1
ฉันใช้ตัวเลือก <appSettings file = ".. "> เนื่องจากฉันต้องรวมการตั้งค่า
Spikolynn

1
@JeffreyRoughgarden ถ้าคุณรวมไฟล์ ConnectionStrings.config ใน Solution Explorer ไฟล์นั้นไม่จำเป็นต้องมีอยู่ใน filesysterm หรือไม่? และถ้าเป็นเช่นนั้นแสดงว่าคุณได้ตรวจสอบการควบคุมแหล่งที่มาแล้ว ซึ่งเป็นปัญหาเริ่มต้นที่เราพยายามหลีกเลี่ยง
Jez

20

วิธีแก้ปัญหาสำหรับไฟล์ web.config และ Visual Studio 2010:

1) แก้ไขไฟล์. csproj เว็บของคุณด้วยตนเองเพื่อเพิ่มAfterBuildTarget ดังนี้:

  <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 (ไม่ใช่เว็บ) แต่ฉันไม่ได้อธิบายเพิ่มเติม


ฉันเปลี่ยนชื่อ Web.config เป็น Web.base.config สร้างไฟล์ Web.config ใหม่จากนั้นเปลี่ยนจาก <Copy SourceFiles = "web.config"> เป็น <Copy SourceFiles = "web.base.config" ในขั้นตอนที่ 1 การทำเช่นนี้ฉันสามารถมี web.config ในเครื่องที่สามารถละเว้นในการควบคุมแหล่งที่มาได้
S. Baggy

สิ่งนี้ยังไม่เหมาะ แต่ฉันชอบวิธีอื่น
JMK

คุณคิดว่าเป็นไปได้ไหมที่จะใช้web.default.configwhen web.$(USERNAME).configไม่มีอยู่จริง? ขอบคุณสำหรับคำตอบที่ดีนี้
Christian Gollhardt

2

เรากำลังใช้ machine.config เพื่อหลีกเลี่ยงความแตกต่างใน web.config ระหว่างสภาพแวดล้อม


14
ค่อนข้างต้องการหลีกเลี่ยงการเปลี่ยน machine.config
twarz01

0

แล้วการละเว้นไฟล์มันจะไม่ถูกเช็คอินได้อย่างไร? ฉันพบปัญหาที่คล้ายกันและได้เพิ่ม web.config ลงในรายการละเว้นในการโค่นล้ม

ใน TFS มันยากกว่าเล็กน้อยดูโพสต์นี้เกี่ยวกับวิธีการทำ


0

วิธีหนึ่งที่คุณสามารถรับมือได้คือการมีระบบโทเค็นและใช้สคริปต์คราดเพื่อเปลี่ยนค่า

วิธีการพื้นฐานเพิ่มเติมอาจมีลิงก์ไปยังไฟล์ AppSettings.config สำหรับ AppSettings ทั้งหมดใน web.config ของคุณ (คล้ายกับการเชื่อมต่อ) เช่น

<appSettings configSource="_configs/AppSettings.config" />

จากนั้นให้โฟลเดอร์ที่มีนักพัฒนาแต่ละคนมีเวอร์ชันในโฟลเดอร์ย่อย (เช่น / _configs / dave /) จากนั้นเมื่อนักพัฒนาทำงานกับโค้ดของตนเองพวกเขาจะคัดลอกจากโฟลเดอร์ย่อยไปยังรูทของโฟลเดอร์ที่เชื่อมโยง

คุณจะต้องตรวจสอบให้แน่ใจว่าคุณได้แจ้งการเปลี่ยนแปลงกับไฟล์เหล่านี้ (เว้นแต่คุณจะใช้โทเค็น) หากคุณทำให้ไฟล์ AppSettings.config ไม่อยู่ในการควบคุมซอร์สและตรวจสอบเฉพาะโฟลเดอร์ devs แต่ละโฟลเดอร์ (ทั้งหมด) พวกเขาจะถูกบังคับให้คัดลอกไฟล์ที่ถูกต้อง

ฉันชอบการใช้โทเค็น แต่อาจทำได้ยากกว่าในการเริ่มต้นใช้งานหากนี่เป็นเพียงการแก้ไขด่วนเท่านั้น


0

ละเว้นไฟล์และมี Commom_Web.Config และ Common_App.Config การใช้เซิร์ฟเวอร์บิลด์การรวมแบบต่อเนื่องกับงานบิลด์ซึ่งเปลี่ยนชื่อทั้งสองนี้เป็นชื่อปกติเพื่อให้เซิร์ฟเวอร์บิลด์ทำงานได้


สิ่งนี้ต้องทำบนเครื่อง dev ก่อนที่จะสร้างเซิร์ฟเวอร์
twarz01

การเปลี่ยนชื่อนี้ไม่ควรเกิดขึ้นบนเซิร์ฟเวอร์รุ่น ไฟล์กำหนดค่าทั่วไปที่ถูกเก็บไว้ในการโค่นล้มพวกเขาไม่ขึ้นอยู่กับผู้พัฒนาเฉพาะ ในขณะที่นักพัฒนาทุกคนเรียกใช้ไฟล์ config ของตัวเองเพื่อพัฒนาบนเครื่องของเขาและไม่สนใจที่จะส่งมันเพราะมันไม่ได้เป็นส่วนหนึ่งของการโค่นล้ม
Arthis

สิ่งที่ไม่สนับสนุนคือนักพัฒนากำลังแก้ไขข้อบกพร่องของแอปพลิเคชัน รูทweb.configในโฟลเดอร์ต้นทางถูกใช้ระหว่างการดีบัก หากคุณเช่นการเพิ่มweb.configการ.gitignoreและต้องให้ผู้ใช้สามารถคัดลอกอย่างใดอย่างหนึ่งCommom_Web.Configไปweb.configและแก้ไขมันจินตนาการของพวกเขา, คุณเป็นส่วนหนึ่งของกำลังทางมี แต่เมื่อคุณต้องการแก้ไขบางสิ่งที่เหมือนกันในเครื่องของนักพัฒนาทั้งหมดเช่นsystem.web/compilationส่วนหรือเฉพาะappSettingsที่ควรจะเหมือนกันทุกที่โครงการนี้ก็แตกต่างกัน
binki

0

เรามีปัญหาเดียวกันและสิ่งที่เรากำลังทำคือ

  • ตรวจสอบใน web.config ด้วยค่า testingerver / production
  • นักพัฒนาไปที่ windows explorer และเปลี่ยนโหมดอ่านอย่างเดียวของไฟล์
  • แก้ไขการกำหนดค่าให้เหมาะสมกับสภาพแวดล้อม
  • การเช็คอินใน web.config จะเกิดขึ้นเฉพาะเมื่อค่าการปรับใช้เปลี่ยนแปลงหรือมีการเพิ่มหรือลบรายการกำหนดค่าใด ๆ
  • สิ่งนี้ต้องการความคิดเห็นจำนวนมากสำหรับแต่ละรายการกำหนดค่าเนื่องจากต้องมีการเปลี่ยนแปลงโดยนักพัฒนาแต่ละคน

1
สิ่งนี้อาจทำงานได้ดีขึ้นในร้านค้าที่การควบคุมแหล่งที่มาที่คุณใช้ตั้งค่าฟิลด์เป็นอ่านอย่างเดียวตามค่าเริ่มต้น แต่สำหรับผู้อื่นที่ใช้การโค่นล้มอาจใช้งานไม่ได้เช่นกัน เราสามารถตั้งค่าสิทธิ์อ่านอย่างเดียวในที่เก็บเพื่อป้องกันไม่ให้ถูกคอมมิตอย่างไรก็ตามจะต้องตั้งค่าในไฟล์กำหนดค่าแต่ละไฟล์สำหรับแต่ละสาขา
jpierson

สำหรับพวกเราที่ไม่ได้ใช้บางอย่างเช่น TFS มันไม่ชัดเจนว่าโซลูชันนี้ทำงานอย่างไร คุณช่วยให้ข้อมูลเพิ่มเติมเล็กน้อยได้ไหม นอกจากนี้นักพัฒนาไม่จำเป็นต้องระมัดระวังและไม่ตั้งใจเช็คเอาต์ไฟล์?
binki

-1

สมมติว่าคุณใช้ Visual Studio ทำไมคุณไม่ใช้การกำหนดค่าโซลูชันอื่น ตัวอย่างเช่นคุณสามารถมีการกำหนดค่า Debug ซึ่งใช้ Web.config.debug และ Release config ซึ่งใช้ Web.config.release Web.config.debug ควรมีบางอย่างเช่น

<appSettings file="C:/Standard_Path_To_Configs/Standard_Name_For_Config.config"> 

ด้วยไฟล์ Standard_Name_For_Config.config ที่รวบรวมการตั้งค่านักพัฒนาส่วนบุคคลทั้งหมดในขณะที่ Web.config.release มีการตั้งค่าการใช้งานจริงเสมอ คุณสามารถจัดเก็บการกำหนดค่าเริ่มต้นในโฟลเดอร์ที่ควบคุมแหล่งที่มาและกำหนดให้ผู้ใช้ใหม่นำมาจากที่นั่น


จากนั้นผู้ใช้แต่ละรายที่เคยมีส่วนร่วมในโครงการจะต้องมีการกำหนดค่าการสร้างของตนเอง ดูเหมือนจะไม่ขยายขนาดและไม่สนับสนุนโครงการที่รับเงินบริจาค
binki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.