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

  1. ให้อิสระแก่พวกเขามากขึ้นในขณะที่พัฒนา
  2. สร้างภาพที่เล็กลง

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

ก่อนที่เราจะเริ่มพูดถึงวิธีที่เราเพิกเฉยต่อไฟล์เหล่านั้น เราต้องเข้าใจว่า Tsuru สร้างโปรเจ็กต์ของคุณให้เป็นไฟล์อย่างไร เรามีฟังก์ชันที่เรียกว่า targz ซึ่งคัดลอกไปยังไฟล์ที่สร้างไว้ก่อนหน้านี้ archive.tar.gz ทุกอย่างที่ได้รับการจัดสรรลงในบัฟเฟอร์โดยการแยกวิเคราะห์ทุกไดเร็กทอรี / ไฟล์

งานทั้งหมดนี้เริ่มต้นขึ้นที่นี่ โดยมีขั้นตอนดังนี้:

  1. รวบรวมรูปแบบการละเว้นจาก .tsuruignore;
  2. สร้าง ละเว้นแผนที่;
  3. แยกวิเคราะห์ไฟล์และไดเร็กทอรี

ตัวอย่างรูปแบบที่สามารถเพิ่มลงใน .tsuruignore ของคุณ :

app.py
*.<file type>          // Means any named file of this type of file
<file name>.*          // Means any type of file with this name
dir/specific/path/<name>.<file type>
relative/dir/*/path    // Means any directory that leads to <path>

สิ่งที่คุณต้องสังเกตเมื่อเพิ่มบรรทัด 1,2,3 คือ มันจะเป็นรูปแบบสากล ซึ่งหมายความว่า หากไฟล์ประเภทใดก็ตามที่ตรงกับรูปแบบนี้ ไฟล์นั้นจะถูกละเว้น (นี่คืออิสรภาพที่มาพร้อมความรับผิดชอบ) หลังจากตั้งค่า .tsuruignore ของคุณแล้ว ทุกบรรทัดจะถือเป็นรูปแบบ ดังนั้นเอาต์พุตจะเป็นชิ้น ๆ และจะถูกแยกวิเคราะห์เป็นฟังก์ชันเรียกซ้ำ ( 1) ที่ใช้ Go'sfilepath.Glob(pattern) เพื่อค้นหารายการที่ตรงกันในทุกรูปแบบที่กำหนดเพื่อระบุว่า ที่ไหนและอะไร ที่ควรละเว้น

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

ignoreSet := make(map[string]struct{})
if _, exist := ignoreSet[pattern]; exist {
    continue // Send us to the next pattern
}
// you can have a macro view on this loop here

ซึ่งหมายความว่าด้วย full path pattern (fpp) การตรวจสอบว่าอยู่บน ignoreSet หรือไม่นั้นทำได้ง่ายมาก และไม่จำเป็นต้องทำซ้ำใดๆ

หากคุณต้องการเจาะลึกโค้ด คุณสามารถไปที่ PRที่นี่ ของฉันได้

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

(1) Recursive Glob (ลิงก์ไปยังส่วนสำคัญ):

func RecursiveGlob(dirPath string, pattern string) ([]string, error) {
 old, err := os.Getwd()
 if err != nil {
  return nil, err
 }
 defer os.Chdir(old)
 err = os.Chdir(dirPath)
 if err != nil {
  return nil, err
 }
 paths, err := filepath.Glob(pattern)
 if err != nil {
  return nil, err
 }
 for i := range paths {
  paths[i] = filepath.Join(dirPath, paths[i])
 }
 dir, err := os.Open(dirPath)
 if err != nil {
  return nil, err
 }
 fis, err := dir.Readdir(0)
 if err != nil {
  return nil, err
 }
 for _, f := range fis {
  if f.IsDir() {
   glob, err := RecursiveGlob(filepath.Join(dirPath, f.Name()), pattern)
   if err != nil {
    return nil, err
   }
   paths = append(paths, glob...)
  }
 }
 return paths, nil
}