การควบคุมเวอร์ชันและไฟล์กำหนดค่าส่วนบุคคล


36

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

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

อย่างไรก็ตามเรื่องนี้ยังคงเหมือนโซลูชัน Ad-hoc

คุณช่วยเสนอทางออกที่ดีกว่าได้ไหม?

มืออาชีพทำอะไร



4
เกรงกลัว ... คุณจะทำไมในโลกแม้จะช่วยให้นักพัฒนาที่จะเปลี่ยนชื่อโมดูลและการกำหนดค่าของลูกค้าแบ่งที่จุดอื่นที่ไม่ใช่รุ่นใหญ่ ?
Mark Booth

@jk ใช่มีการแข่งขันที่ดียิ่งขึ้น: stackoverflow.com/questions/1974886//
Erel Segal-Halevi

ฉันงง นี่ไม่ใช่ปัญหาเมื่อคุณติดตั้งการอัพเกรด
Joshua

6
มันไม่ได้เป็นโซลูชั่น Ad-hoc เลย ไฟล์กำหนดค่าหลักอยู่ในการควบคุมเวอร์ชันแทนที่ตามที่กำหนดโดยไฟล์กำหนดค่าเฉพาะผู้ใช้ แน่นอนว่าจำนวนของการกำหนดค่าเฉพาะสำหรับผู้ใช้จำเป็นต้องลดลง แต่จำนวนเล็กน้อยอาจไม่สามารถหลีกเลี่ยงได้
William Payne

คำตอบ:


22

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

ฉันนึกถึงโซลูชันที่เป็นไปได้สองข้อที่นี่:

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

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

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


11

มันเป็นทางออกที่สมเหตุสมผล

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

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

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

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


3

เรามีวิธีแก้ปัญหาที่น่าสนใจเราเป็นนักพัฒนา PHP เป็นหลักดังนั้นเราจึงใช้ Phing ซึ่งช่วยให้คุณสร้างงานอัตโนมัติที่เขียนด้วย PHP ดังนั้นแทนที่จะทำการปรับปรุง svn ปกติของเราเราทำการ "phing update" ซึ่งเรียกการอัพเดท svn จากนั้นแทนที่ configs ของเราด้วยตัวแปรที่เหมาะสมตัวอย่างเช่น config:

$db_user = "${test.db_user}";

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


2

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

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


+1 สำหรับการกล่าวถึงว่านี่ไม่ใช่ปัญหาสำหรับนักพัฒนา แต่เป็นปัญหาการปรับใช้ทั่วไป
sleske

2

ใส่หมายเลขเวอร์ชันลงในไฟล์กำหนดค่าส่วนบุคคล (หมายเลขเวอร์ชันของรูปแบบไฟล์กำหนดค่า)

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

คุณอาจต้องการกระบวนการบางอย่างเช่นนี้สำหรับผู้ใช้ปลายทางดังนั้นคุณอาจใช้กระบวนการนี้เพื่อทำให้ชีวิตนักพัฒนาของคุณง่ายขึ้น


1

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

ดูแลเพื่อให้แน่ใจว่าการผสานนั้นถูกต้อง แต่ดูเหมือนว่าปลอดภัยสำหรับฉัน


ดูเหมือนว่าจะเกิดข้อผิดพลาดได้ง่าย ฉันเคยเห็นสิ่งนี้ทำแล้ว แต่ devs คอยตรวจสอบการตั้งค่าส่วนตัวโดยไม่ตั้งใจซึ่งจะเขียนทับการตั้งค่าอื่น ๆ ที่ devs ใช้ :-( นอกจากนี้ยังหมายความว่าต้นไม้ทั้งหมดจะแสดงเป็น "แก้ไข" ในเครื่องมือ VCS ซึ่งเป็นสิ่งที่ดีมาก ไม่สะดวก.
sleske

@sleske มันต้องมีจำนวนของวินัย แต่โดยสุจริตฉันคาดหวังความสามารถในการทำเช่นนี้ได้ดีจากนักพัฒนาส่วนใหญ่
Thomas Owens

1

สิ่งที่เราทำที่นี่คือสร้างกลุ่มของการตั้งค่า สิ่งนี้สามารถทำได้ใน Zend ดังนี้:

[production]
key1: parameter1
key2: parameter2

[testing: production]
key1: parameter2
key3: parameter4

ซึ่งหมายความว่าการทดสอบสืบทอดการผลิตและขยายด้วย key3 นักพัฒนาซอฟต์แวร์ทุกคนต้องทำคือกำหนดสภาพแวดล้อมของเขา (การทดสอบหรือการผลิตในกรณีนี้)


การตั้งค่าเฉพาะผู้ใช้มากขึ้น พวกเขารวมถึงสิ่งต่าง ๆ เช่นโฟลเดอร์การติดตั้งของแอปพลิเคชันการตั้งค่าส่วนตัว ฯลฯ ดังนั้นจึงไม่เพียงพอที่จะเลือกระหว่างสองสภาพแวดล้อมที่กำหนดไว้ล่วงหน้า
Erel Segal-Halevi

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

ฉันต้องการโซลูชันทั่วไปที่สามารถจัดการการกำหนดลักษณะเฉพาะของผู้ใช้ได้ทุกประเภทไม่ใช่เฉพาะทรัพยากร
Erel Segal-Halevi

แค่คิดที่นี่ แต่จะดีกว่าไหมถ้าจะเก็บไว้ในฐานข้อมูล? อย่างน้อยการตั้งค่า จากนั้นคุณสามารถจับคู่ผู้ใช้เหล่านั้นกับคู่ได้ ถ้าไม่เป็นเพียงความคิด;)
Agilix

0

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

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

  1. สร้างไฟล์ dummy comfig และ. gitignore
  2. สร้าง makefile ที่สามารถเข้ารหัสและถอดรหัสไฟล์กำหนดค่า
  3. เก็บ makefile และไฟล์กำหนดค่าที่เข้ารหัสไว้ในที่เก็บ
  4. makefile ถามหารหัสผ่านและวิธีการติดต่อผู้เขียนเพื่อขอรหัสผ่าน
  5. เมื่อสร้างโปรเจ็กต์หาก makefile ไม่ได้ทำงานแนะนำผู้ใช้ด้วย console.error ("ไฟล์ config [conf / settings.json] หายไป! คุณลืมรันmake decrypt_confหรือไม่");
  6. มีการอธิบายการตรวจสอบเพื่อให้แน่ใจว่าไฟล์กำหนดค่าเป็นปัจจุบัน

1
-1 เนื่องจากสิ่งนี้ไม่ตอบคำถามเดิมเลย นอกจากนี้คำตอบที่มากกว่าลิงก์และไม่มีคำอธิบายใด ๆ ที่ไม่เป็นประโยชน์สำหรับรูปแบบ Stack Exchange Q / A เนื่องจากลิงก์ภายนอกอาจหายไปในบางจุดโดยไม่มีการอ้างอิงถึงคำตอบที่แนะนำ
ดีเร็ก

1
นี่เป็นบทความที่น่าสนใจ
Erel Segal-Halevi

0

เราสร้างเครื่องมือชื่อConfigที่จัดการปัญหาการกำหนดค่าเช่นนี้ สิ่งที่คุณจะทำคือสร้างไฟล์กำหนดค่าต้นแบบ 1 (หรือนำเข้า) จากนั้นสร้างสภาพแวดล้อมที่เรียกว่า Local ในระบบ Local สร้างหลาย ๆ อินสแตนซ์ 1 อินสแตนซ์ต่อผู้ใช้ หากคุณต้องการทำการเปลี่ยนแปลงที่เกิดขึ้นทั่วทั้งบอร์ดเช่นการเพิ่มรายการการกำหนดค่าใหม่หรือแก้ไขชื่อโมดูลเพียงทำการเปลี่ยนแปลงและมันจะถูกนำไปใช้ทั่วกระดาน หากคุณต้องการเปลี่ยนอินสแตนซ์ / ผู้ใช้ให้ตั้งค่าตัวแปรนั้นจากนั้นเปลี่ยนตัวแปร การเปลี่ยนแปลงนี้จะใช้กับอินสแตนซ์ / ผู้ใช้ของคุณเท่านั้น ทั้งหมดนี้อยู่ภายใต้การควบคุมเวอร์ชัน คุณปรับใช้ไฟล์การกำหนดค่าผ่านการผลักหรือดึง ตัวเลือก pull คล้ายกับ git pull แต่สำหรับอินสแตนซ์ / ผู้ใช้เฉพาะนั้น

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


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

ฉันไม่คิดว่า Config เป็นสิ่งที่เกินความจริงหากคุณพิจารณาว่าการติดตั้งง่ายแค่ไหนเมื่อเทียบกับเวลาที่ใช้ในการพยายามหาวิธีแก้ปัญหาถามชุมชนนำไปปฏิบัติและบำรุงรักษา การกำหนดค่าทำงานบนแพลตฟอร์มรูปแบบภาษาห้องสมุดดังนั้นคุณจะได้เรียนรู้เพียงครั้งเดียว สำหรับข้อมูลที่ละเอียดอ่อนมีตัวเลือกการเข้ารหัสฝั่งไคลเอ็นต์ซึ่งเป็นตู้นิรภัยในตัวหากคุณต้องการ ผู้ใช้ที่เข้ามาทั้งหมดสามารถติดตั้งในบ้านหรือใช้ VPC
Bienvenido David
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.