# 【Day7】gitignore - 杜絕上傳錯誤資料，從此不再發生慘痛經驗

- 作者：林鼎淵（Dean Lin）
- 網址：https://deanlin.net/blog/202009/fb-ig-crawler-day-07/
- 發布：2020-09-22
- 主題：技術教學
- 系列：FB & IG 爬蟲專案從零開始
- 標籤：iT 邦幫忙鐵人賽、.gitignore、Version Control、Git、慘痛經驗分享
- 摘要：筆者曾待過超瞎的公司，他們對於一個專案遷移的概念還停留在把程式 copy 到 USB，到現場的時候再把他放到正式的server上面

> 在你的成長的路上總有不少值得你警惕的前輩

## 為什麼寫這篇文章？

### 慘痛經驗 part 1

筆者曾待過超瞎的公司，他們對於一個專案遷移的概念還停留在把程式 copy 到 USB，到現場的時候再把他放到正式的server上面

所以每次發布新版本都超級心驚膽跳擔心會不會檔案沒有 call 完全(如果你曾經在 windows 上複製過 node_modules 超過 2G 的專案就會知道我在說什麼惹)、會不會到現場的 server 跑不動，這個詭異的問題直到我離開那間公司後才知道根本是一道假命題…

- 都用 git 了，為什麼還要把程式 call 到 USB？？？
- `都有 package.json 紀錄要安裝的套件跟版本了，我幹嘛要複製好幾G的套件進去 USB？？？`
不要笑，我相信現在還是有公司用這麼瞎的方式在發布新版本XD

### 慘痛經驗 part 2

筆者曾在公司兼職 MIS，幫公司架一個 gitlab 提供內部使用；但每個人 git 使用的習慣相差很大，有些部門的同事根本就沒在管什麼檔案適合傳到 gitlab 什麼不適合，每次 push 都全部上傳(各種執行檔、暫存檔全部上傳，根本把 gitlab 當成 NAS 在用…)

因為 git 版本控管的特性，他的專案在 gitlab 就越來越肥，儘管跟他溝通很多次這樣的 git 版控很有問題但都被當成耳邊風，直到有一天 gitlab 的硬碟終於被他用完了…(他一個專案就用了 15GB 的容量)，他才開始願意去了解自己專案中有多少檔案是不需要上傳的

> PS.因為 gitlab 一般只會儲存程式碼，所以當時只劃分了 100GB 的硬碟空間

### 慘痛經驗 part 3

這個事件發生在一個熱愛技術的朋友身上，他使用了一個需要憑證的套件，這個憑證會根據使用者使用的次數去做收費，不知道他當時是喝多了還是太累了；他居然把憑證加入 git 版控上傳，我永遠記得下個月他收到帳單時臉上的表情有多麼的驚嚇

### 昨日經驗

昨天我們說到 `.env 裡面存放的資料有許多都不適合公開`(ex:資料庫帳號密碼、token…)，這些資料外流出去我想就不是檢討報告能解決的問題惹，為了避免誤傳檔案，今天我來介紹一個好用的東西 `.gitignore`，他是一份忽略清單，忽略清單上的都是不需要加入版本控制的檔案

## 今日目標

1. 了解哪些檔案/資料夾不需要放入版控
2. 在專案加入 .gitignore
3. 透過 VSCode 知道是否成功將檔案加入忽略清單
4. 為環境變數加上一個可以上傳的範例檔

## 1. 哪些檔案/資料夾不需要放入版控?

有了上方慘痛經驗的範例，我想大家應該對要加入 .gitignore 的檔案/資料夾有基礎概念了，在這我也整理了常見在忽略清單如下：

1. **機敏性資料**：資料庫帳號密碼、存取權限的權杖(token)、憑證(credentials)…
2. **環境變數**：專案env檔(因為裡面通常存有ip、password…等隱私資訊)
3. **套件資料夾**：node_module、vendor…
4. **日誌檔案**：log相關紀錄
5. **程式編譯時產生的檔案**：快取檔案、暫存檔案、編譯結果

透過這份清單，大家可以想一下昨天的專案有哪些檔案/資料夾是要加入這份忽略清單的呢

## 2. 在專案加入.gitignore

1. 上一篇有提到我們這次的爬蟲會用到 FB & IG 的帳號密碼還有你 google sheet 的 id，這些資訊我們統一設定在 .env 環境變數裡面，我相信大家都不希望把這些機敏資訊放到 git 外流出去
2. 另外我們 `透過 yarn 安裝的 dotenv 套件也產生了一個 node_modules 的資料夾`，從經以後你所安裝的套件都會儲存到這個資料夾裡面，通常一個中型專案套件他的大小都高達 300MB 以上，所以這個 node_modules 的資料夾是不適合上傳到到 git 的(這些套件到新環境下指令yarn就能安裝)

所以我們的忽略清單會長這樣

### .gitignore

```
node_modules
.env

```

## 3. 透過 VSCode 知道是否成功將檔案加入忽略清單

如果你也是用 VSCode 當成編輯器，可以用他觀察使用 .gitignore 的前後變化

- **使用 .gitignore 前：** .env 及 node_modules 會被列入變更；`綠色的字代表有新增(U)的檔案，棕色的字代表有改變(M)的檔案`

- 在 `SOURCE CONTROL` 中可以看到有哪些檔案被列入變更

- **使用 .gitignore 後：** .env 及 node_modules 會變成`淺灰色`，代表不會被列入變更

**這份忽略清單會隨著你專案的變動而調整**，如果你在撰寫其他種類程式語言可以參考[github的官網](https://github.com/github/gitignore)來調整自己的.gitignore

## 4. 為環境變數加上一個可以上傳的範例檔

今天我們把 .env 放入 .gitignore 中讓他不會加入版控，`但為了讓專案快速遷移，我會建立一個 .env.example 的檔案`，他是環境變數的範例檔，這樣你在新環境只需要將他複製一份到 .env 檔填上自己的參數就能完成環境設定了，下面是本專案未來會用到的環境變數

### .env.exmaple

```
#填寫你目標放入的sheet id
SPREADSHEET_ID='your sheet id'

#你FB及IG的帳號密碼(建議用小帳號)
IG_USERNAME='ig username'
IG_PASSWORD='ig password'
FB_USERNAME='fb username'
FB_PASSWORD='fb password'

#這是設定排程的時間參數(目前預設每日22:30準時執行)
CRONJOB_TIME='0 30 22 * * *'

```

## ⏭️ 下個階段

關於撰寫程式的基礎介紹就到今天，從明天會開始**撰寫爬蟲**，這裡先跟各位分享一下我對於功能撰寫順序的邏輯以及技術文章未來的規劃

- **判斷哪個功能需要最先研究**

1. 我們先前列出很多功能項目，我個人對於研究的前後順序是先把不熟悉的完成，因為他通常會花你最多時間
2. 如果中間有遇到無法解決的問題，最慘的結果就是你必須放棄這個專案，所以我建議不熟悉的東西你最好再接案前要做一下功課確認是可以完成的，這就是你從最難的部分開始實作的好處：及時止損，避免你完成大部分功能最後因為卡在一個關鍵功能無法完成交付

- **專案撰寫順序**
我會按照我當時撰寫的思路完整的呈現給大家，目前的順序是：

- 爬蟲功能 → 儲存到雲端Google Sheets → 電腦自動排程執行 → LINE通知提醒執行結果

## ℹ️ 專案原始碼

今天的完整程式碼可以在[這裡](https://github.com/dean9703111/ithelp_30days/tree/master/day7)找到喔

> **在許多人的幫助下，本系列文章已出版成書，並添加了新的篇章與細節補充：**
> 加入更多實務經驗，用完整的開發流程讓讀者了解專案每個階段要注意的事項
> 將爬蟲的步驟與技巧做更詳細的說明，讓讀者可以輕鬆入門
> 調整專案架構
> 優化爬蟲程式，以更廣的視角來擷取網頁資訊
> 增加資料驗證、錯誤通知等功能，讓爬蟲執行遇到問題時可以第一時間通知使用者
> 排程部分改用 node-schedule & pm2 的組合，讓讀者可以輕鬆管理專案程序並獲得更精確的 log 資訊
> **有興趣的朋友可以到天瓏書局選購，感謝大家的支持。**
> **購書連結**：[https://www.tenlong.com.tw/products/9789864348008](https://www.tenlong.com.tw/products/9789864348008)

---

關於作者：林鼎淵（Dean Lin），台灣的生成式 AI 企業內訓講師、外商資安公司軟體專家，也是生成式 AI 創新學院發起人。出版 7 本書（包含全台第一本 ChatGPT 應用專書），兩度獲得 iThome 鐵人賽佳作，累積上百場授課與顧問經驗。（https://deanlin.net/about/）
引用時請附上原文網址：https://deanlin.net/blog/202009/fb-ig-crawler-day-07/
