Di sini, di Tsuru PaaS kami memiliki keinginan untuk memungkinkan pengembang mengabaikan jenis file tertentu di direktori proyek mereka untuk mencapai dua hal:

  1. Beri mereka lebih banyak kebebasan saat berkembang;
  2. Bangun gambar yang lebih kecil.

.tsuruignore hadir untuk memenuhi kebutuhan Anda dalam menghasilkan lebih banyak dengan lebih sedikit, ini memungkinkan Anda membangun perangkat lunak besar dan hanya menerapkan apa yang benar-benar diperlukan (berfungsi seperti .gitignore).

Sebelum kita mulai membahas tentang bagaimana kami mengabaikan file-file tersebut, kita perlu memahami bagaimana Tsuru membangun proyek Anda menjadi sebuah file. Kami mendapat fungsi bernama targz yang menyalin ke file yang dibuat sebelumnya archive.tar.gz segala sesuatu yang dialokasikan ke buffer dengan mengurai setiap direktori/file.

Di sinilah semua pekerjaan ini dimulai, jadi langkah-langkahnya adalah:

  1. Kumpulkan pola abaikan dari .tsuruignore;
  2. Bangun peta abaikan;
  3. Parsing file & direktori.

Contoh pola yang dapat ditambahkan pada .tsuruignore anda :

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>

Yang harus Anda perhatikan saat menambahkan baris 1,2,3 adalah Ini akan menjadi pola global, yang berarti jika ada jenis file yang cocok dengan pola ini, maka akan diabaikan (ini adalah kebebasan dengan tanggung jawab). Setelah mengatur .tsuruignore Anda, setiap baris dianggap sebagai sebuah pola, jadi outputnya adalah sebuah irisan dan akan diurai menjadi fungsi rekursif ( 1) yang menggunakanfilepath.Glob(pattern) Go untuk menemukan kecocokan pada setiap pola tertentu guna menentukan dengan tepat di mana dan apa yang harus diabaikan.

Jika suatu jalur cocok, jalur tersebut akan ditambahkan ke peta bernama ignoreSet (yang berisi jalur lengkap file sebagai kunci dan struct kosong sebagai nilai). Kami tidak menggunakan irisan karena Ini akan memerlukan iterasi di atasnya dan di Go kami hanya dapat melakukan:

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

Artinya dengan full path pattern (fpp) , memeriksa Jika Ada di ignoreSet sangatlah sederhana dan tidak memerlukan pengulangan apa pun.

Jika Anda ingin mendalami kode ini secara mendalam, Anda dapat mengunjungi PR sayadi sini.

OBS: Kami tidak mencoba menulis ulang .gitignore, kami hanya membuat platform kami lebih sesuai dengan kebutuhan pengguna kami; Anda dapat melihat "Masalah" yang berasal dari postingan ini "di sini". Posting ini hanyalah perpanjangan dari apa yang dijelaskan dalam dokumentasi kami.

(1) Glob Rekursif (“tautan ke Intisari”):

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
}