如何提高工作效率 - 自動化篇

YxxxHao發表於2018-11-25

擺脫瞎忙人生,從自動化做起。作為一名職場人,有沒有為忘發彙報郵件而煩惱過,有沒有因繁忙的工作而丟三落四過;作為一名程式設計師,有沒為每天早上 pull 程式碼後漫長的編譯時間而煩躁過,有沒有為各種無腦的系統配置而無聊過。每天我們都在這些重複枯燥的事情中,浪費著我們寶貴的生命。如何提高工作效率成為我們至關重要的事情 ,這篇檔案將會帶領我們通過自動化的方式,來有效地提高我們的工作效率。

本文大部內容是基於 MacOS 環境的,非 Mac 黨也可以借鑑其中的一些思想。

Shell Script

Shell 與 Shell Script

在談自動化之前,我們先來了解下 Shell Script 這門有點古老而又非常強大的指令碼語言,首先我們要分清一個概念性的問題,Shell 和 Shell Script 之間的區別:

Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。

Shell 指令碼(Shell Script),是一種為 Shell 編寫的指令碼程式。

這裡先給大家科普下概念,但大多的時候,我們都統稱 Shell Script 為 shell,文中的其它地方的 "shell" 指的同樣是 Shell Script。關於 shell 的基礎語法,並不在本文的討論範圍內,但在開始實踐如何通過 shell 來提高我們工作效率之前,我來我簡單介紹 shell 幾個常用而又強大的功能。

常用串聯命令

管道

管道是 shell 中非常常用的功能之一,它允許不同指令碼、命令之間互相傳遞資料,例如:

ls | grep 'pars'
複製程式碼

該命令意思是將 ls 輸出的內容傳遞到 grep 'pars' 命令,grep 會把包含 'pars' 的內容過慮出來。我們再舉個栗子,通過 shell 獲取 git 倉庫裡中的當前分支名:

currentBranch=`git branch | grep "*"`
currentBranch=${currentBranch/* /}
複製程式碼

重定向

大多數 UNIX 系統命令從終端接受輸入並將所產生的輸出傳送回終端。一個命令通常從一個叫標準輸入的地方讀取輸入,預設情況下是終端。同樣,一個命令通常將其輸出寫入到標準輸出,預設情況下也是終端。如果你需要修改輸入或輸出,就需要使用到重定向功能。

命令 說明
command > file 將輸出重定向到 file。
command < file 將輸入重定向到 file。
command >> file 將輸出以追加的方式重定向到 file。

輸出重定向,指將一條命令的輸入位置重新定義,舉個例子:

ls > ls.txt
複製程式碼

ls 輸出結果應顯示在終端,而上面命令將 ls 的輸出結果寫到 ls.txt 這個檔案中。需要注意,用 > 重定向到 ls.txt 檔案預設是覆蓋的,如果需要用追加的方式寫入檔案,則需要使用 >>:

pwd >> ls.txt
複製程式碼

輸入重定向:

pbcopy < ls.txt
複製程式碼

上面的命令的意思是,將 ls.txt 的內容複製到貼上板。

之所以簡單介紹這幾個常用功能,是因為如果不懂這些功能,會影響理解下面的內容。如果你對 shell 指令碼不熟悉,建議你抽空學習一下,日常工作中,用到 shell 的頻率還是非常高的。

實踐是檢驗學習的唯一標準

簡單聊完 shell 這幾個常用而又強大的功能後,我們開始實踐如何通過 shell 來提高工作效率。

雙網路卡自動配置

因我日常工作的需要,電腦需要配置雙網路卡,這裡以配置電腦的雙網路卡為例,先附上部分配置指令碼:

inside_ssid=\"WIFINAME\";
en0_ssid=\"$(networksetup -getairportnetwork en0 | sed 's/.*[:] //')\"
if [ \"$en0_ssid\" != \"$inside_ssid\" ]; then
 echo -n \"請先將內網路卡設定到$inside_ssid\"
else
 inside_adaptor_index=\"$(netstat -rn|grep default |grep en0 -n | cut -d: -f1)\"
 if [ \"$inside_adaptor_index\" = 1 ]; then
  echo -n \"請開啟外網路卡,且服務順序在內網路卡前\"
 else
  inside_gateway=\"$(netstat -rn|grep default |grep en0|awk '{print $2}')\"
  sudo echo \"重新整理配置成功\";
  sudo route -n delete -net 10.*.*.128;
  sudo route -n delete -net 10;
  sudo route -n delete -net 30;
  sudo route -n add -net 10.*.*.128 $inside_gateway;
  sudo route -n add -net 10 $inside_gateway;
  sudo route -n add -net 30 $inside_gateway
 fi
fi
複製程式碼

這裡不解析這些指令碼的作用,我們的重點在於如何進一步提高效率上。由於每次重啟電腦,都需重新配置雙網路卡,才能正常同時使用內外網,也就是說,每次重啟電腦需要重新執行一次這個操作。懶是人類的天性,如果我們連執行一下指令碼也不想幹的話,那麼我們需要怎麼做呢?

我們可以在在電腦開機時設定自啟動任務。首先我需要建立一個 plist 檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>LaunchOnlyOnce</key>
    <true/>
    <key>Label</key>
    <string>com.dengyonghao.xxxx</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/xxxxx/work/Tools/xxxx.sh</string>
    </array>
</dict>
</plist>
複製程式碼

簡單解析下各個 key 的作用,LaunchOnlyOnce 指定開機後只執行一次,不指定則每隔一段時間就會執行一次。Label 指定該 plist 的唯一標識。ProgramArguments 則是設定執行指令碼的路徑,指向你想要啟動時自動執行的指令碼路徑。

完成上面操作後,把建立的 plist 檔案拷貝到 ~/Library/LaunchAgents目錄下,表示僅對當前使用者生效,然後執行:

sudo launchctl load ~/Library/LaunchAgents/xxxxxx.plist
複製程式碼

將這個檔案註冊到系統中,然後電腦啟動時就會自動執行,完成雙網上的配置。這裡有一個問題,如果啟動時自動執行上面的雙網路卡配置指令碼,真的能正常執行嗎?

事實上是不行的,因為 sudo 命令需要你輸入管理員密碼,但你並沒有地方輸入,所以是沒有許可權進行這些操作的。故我們需要用到 Apple Script,從而引出下一節的內容,這裡先附上 Apple Script 指令碼:

do shell script "
inside_ssid=\"WIFINAME\";
en0_ssid=\"$(networksetup -getairportnetwork en0 | sed 's/.*[:] //')\"
if [ \"$en0_ssid\" != \"$inside_ssid\" ]; then
 echo -n \"請先將內網路卡設定到$inside_ssid\"
else
 inside_adaptor_index=\"$(netstat -rn|grep default |grep en0 -n | cut -d: -f1)\"
 if [ \"$inside_adaptor_index\" = 1 ]; then
  echo -n \"請開啟外網路卡,且服務順序在內網路卡前\"
 else
  inside_gateway=\"$(netstat -rn|grep default |grep en0|awk '{print $2}')\"
  sudo echo \"重新整理配置成功\";
  sudo route -n delete -net 10.*.*.128;
  sudo route -n delete -net 10;
  sudo route -n delete -net 30;
  sudo route -n add -net 10.*.*.128 $inside_gateway;
  sudo route -n add -net 10 $inside_gateway;
  sudo route -n add -net 30 $inside_gateway
 fi
fi" with administrator privileges
複製程式碼

這裡只是用 Apple Script 來提供一個圖形介面來要求使用者先輸入管理員密碼,才允許他繼續執行指令碼。指令碼使用了 Apple Script,故開機啟動項的 plist 的檔案也要做相應的變化:

<key>ProgramArguments</key>
<array>
    <string>osascript</string>
    <string>/Users/xxxx/work/Tools/xxxx.scpt</string>
</array>
複製程式碼

關於 Apple Script 的內容將在下一節詳細介紹,這裡我們先思考一個問題:設定開機執行後,就能解決上面說的痛點了嗎?

事實上並不能解決所有問題,比如說,開機的時候外接網路卡沒有插上,那麼自動執行的指令碼就會配置失敗,這時就又回到最初的場景,需要我們去找到這個指令碼檔案,然後通過終端執行。那麼我們可以怎麼去優化這個流程呢?我們帶著這個問題,繼續後面的內容,然後來再回來解決它。

集思廣益

在給團隊成員分享的過程中,隊友們提出 sudo 可以明文設定管理員密碼,不需要每次執行時手動輸入,命令格式如下:

echo password | sudo -S xxxxxxxxx
複製程式碼

需要注意的是,明文儲存密碼存在洩露的風險,建議使用這種方式前先評估風險。

Apple Script

Apple Script 是什麼?

AppleScript 是 Apple 建立的指令碼語言,用於自動執行 Macintosh 作業系統及其許多應用程式操作的語言。可以用來控制執行於 macOS 上的程式,以及 macOS 本身的部分內容。你可以建立指令碼來自動執行重複性任務,或組合多個可編寫指令碼的應用程式的功能來建立複雜的工作流程。

我們使用 AppleScript 建立備忘錄、管理網路、處理影象、備份檔案等等,AppleScript 是功能非常強大的自動化工具,它內建於 macOS 系統中,通過 指令碼編輯器 應用來編寫和執行,任何使用者都可以免費使用它。

指令碼編輯器

macOS 中預設已經提供編寫 AppleScript 的工具:指令碼編輯器,我們可以通過應用程式中找到並啟動它。

01.png

我們第一個 AppleScript 指令碼

我們開啟指令碼編輯器並選擇新建文稿,輸入以下內容:

tell application "Finder" to open the startup disk
複製程式碼

點選執行後,系統會在桌面開啟一個新的Finder視窗,顯示啟動盤的內容,這裡我們已經完成了第一個 AppleScript 指令碼。

再舉個栗子,通過 AppleScript 開啟或者關閉 Xcode:

tell application "Xcode"
	activate
	--quit
end tell
複製程式碼

從上面指令碼可以看出,AppleScript 和自然語言非常接近,編寫起來十分簡單,但至於如何去學習 AppleScript 的語法,這裡不會多做講解,有興趣的同學可以通過官方文件學習。

如何學習 AppleScript

巧用文件

03.png

Dash,程式設計師神器之一,強烈推薦一波。

我們在學習一門新的程式語言時,當在使用某個 API 遇到問題時,最靠譜的解決方法不是 Google,而是先看下它的文件 。我們可以通過 Dash 下載 AppleScript 文件,遇到問題時,我們可以快速查閱,並且 AppleScript 的文件並不多,空閒時可以通讀一次(估計2-3小時),逐步加深對 AppleScript 的瞭解。

讀懂 AppleScript 詞典

04.png

實踐出真知

彙報郵件提醒&自動生成

下面我們直接開始實操,來實現一個自動提醒傳送重點專案進度的工具,除了提醒功能外,該工具還會自動幫你建立郵件模組,包括收件人、主題、內容模板等,我們來看實現指令碼:

on callback()
	tell (current date) to get (its year as integer) & "-" & (its month as integer) & "-" & day
	set dataText to the result as text
	set mailTitle to "-重點專案進度" as text
	set mailTitle to dataText & mailTitle
	tell application "Microsoft Outlook"
		set newMessage to make new outgoing message with properties {subject:mailTitle, content:"Dear xx:<br/>以下是我的重點專案進度情況,詳細請檢視附件:<br/><br/><br/>Best Regards"}
		make new recipient at newMessage with properties {email address:{name:"xxx", address:"xxxx@pingan.com.cn"}}
		#make new cc recipient at newMessage with properties {email address:{name:"Name", address:"test@example.com"}}
		
		open newMessage
	end tell
end callback

display dialog "又到週一了,趕緊發重點專案進度" buttons {"現在發", "一會發"} default button 1
if the button returned of the result is "現在發" then
	callback()
end if
複製程式碼

這裡我們通過 AppleScript 訪問 Microsoft Outlook 並自動生成郵件模板,以上指令碼只給郵件內容填充了模組,但實際上還可以實現自動把你的重點專案進度excel統計表附件進來,再進一步的話,可以直接通過 AppleScript 讀取 excel 的內容,然後填充到郵件內容中,只要你在完成重點專案內容後,及時更新 excel 統計表中的內容,那麼到每週一發重點專案的時候,你只需要一個命令就可以自動完成彙報郵件。

我們完成了自動生成郵件模板的功能後,還需提供自動提醒的功能,關於自動提醒功能,我們可以使用 mac 的啟動服務來實現,和自動配置雙網上的方式一模一樣,我們建立相應的 plist 檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.dengyonghao.viproject</string>
    <key>ProgramArguments</key>
    <array>
        <string>osascript</string>
        <string>/Users/dengyonghao/work/Tools/viproject.scpt</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Weekday</key>
        <integer>1</integer>
        <key>Minute</key>
        <integer>30</integer>
        <key>Hour</key>
        <integer>10</integer>
    </dict>
</dict>
</plist>
複製程式碼

需要注意的是這裡多了 StartCalendarInterval 這個 key,這個 key 是用來控制你指令碼的執行週期或者時間的,這裡設定為每週一上午 10:30 時就會自動執行指令碼。

AppleScript 的內容就簡單介紹到這裡,總之 AppleScript 非常強大,具體怎麼使用,建議空閒時共同探討一下。

推薦閱讀

  1. Mac Automation Scripting Guide

Automator

Automator 是什麼?

02.png

Automator 是蘋果公司為 macOS 系統開發的一款軟體,只要通過點選拖拽滑鼠等操作就可以將一系列動作組合成一個工作流程,從而幫助你自動的(可重複的)完成一些複雜的工作。Automator 實際上是一些列動作組合在一個工作流文件裡,然後按順序去執行這些動作,與我們上面所以說的指令碼非常類似,但 Automator 可以橫跨多個程式進行,並提供圖形介面進行操作,使用者操作起來非常方便。

指令碼轉應用

關於 Automator,我們可以通過實現指令碼轉應用的例子進行了解,首先我們開啟 macOS 自帶的 Automator,選新建文稿-->應用程式-->實用工具-->執行xxx指令碼,然後把你的指令碼填寫進去,然後儲存生成一個應用。生成的應用預設是 Automator 的圖示,如果你想去改變圖示,則可以右擊應用—>顯示包內容-->Contents-->Resources,然後把 AutomatorApplet.icns 替換成你想要的圖示就可以了。

我們可以把常用的指令碼生成應用,放到常用的位置,雙擊一下就能執行,這樣也是挺爽歪歪的,但是這並不是我想要的,我想在任意的地方法都可以快速執行,所以這裡就引入了 Alfred 這個工具了。

推薦閱讀

關於 Automator 網上有不少教程,想進一步瞭解的同學,推薦閱讀:Automator 簡單介紹及入門玩法 | Matrix 精選

Alfred & WorkFlows

Alfred 是什麼?可能只能說是神器,不吹不黑,但這裡我是不會講如何去使用 Alfred 的,沒有用過的小夥伴自行百度。

Workflow 又是什麼梗呢,Workflow 工作流的意思,它表示把多個事件聯合在一起,形成一個連貫的動作。

自我學習

這裡省略成千上萬的字,需要你自行去學習 Alfred 的使用,或許它 --> Google 可以幫你

問題回顧

講到這裡,我們可以思考下文章開始配置雙網路卡的那個問題,估計大家都會有更好的方法了。

我們可以把配置雙網路卡的 AppleScript 寫成 Alfred 的一個 workflows。比如我設定了 Alfred 的快捷開啟鍵為 double com,雙網上配置 workflows 的 keyword 為 doublenet,這樣的話,我可以在電腦的任意介面輸入:double com + doublenet + 回車,即可完成雙網路卡的配置。

一鍋亂燉

上面介紹了一堆的工具,看到這裡,可能還是一臉懵逼,現在我們來通過實操,來把它們一鍋燉了。

Goto iTerm

作為一名程式設計師,從 Finder 目錄跳轉到 iTerm 的場景非常多,大多數時候我們都是通過拖動目錄到 iTerm,然後 cd 進去,效率非常低,通過學習上面的內容,我們可以通過 AppleScript + Hotkey 快速在 iTerm 中開啟當前 Finder 的目錄。

首先我們可以通過 AppleScript 獲取當前 Finder 視窗的目錄:

tell application "Finder"
	set pathFile to selection as text
	set pathFile to get POSIX path of pathFile
	--防止目錄存在空格跳轉不了
	set pathFile to quoted form of pathFile
end tell
複製程式碼

然後通過 iTerm 提供的 AppleScript API 跳轉到指定目錄:

ell application "Finder"
	set pathFile to selection as text
	set pathFile to get POSIX path of pathFile
	--防止目錄存在空格跳轉不了
	set pathFile to quoted form of pathFile
	set pathFile to "cd " & pathFile
	--set the clipboard to pathFile
	tell application "iTerm"
		create window with default profile
		tell current session of current window
			write text pathFile
		end tell
	end tell
end tell
複製程式碼

我們完成指令碼後,則可以通過 Alfred 配置一個 Hotkey,用來快速執行該指令碼:

05.png

我這裡面配置的 Hotkey 是 com + T,所以我只要按下 com + T,則會自動開啟 pwd 在當前 Finder 視窗的目錄下的 iTerm。

速記大法

每次開週會時,在一週回顧環節中,總是拼命回顧這周我做了那些事情,特別是分享亮點和不足的時候,就各種詞窮。這裡介紹一個非常有效的方法,就是每天記一記,週會不糾結。其實這個方法大家都知道,只是大家都懶得記,或者是沒有找到一個好的工具,我曾經用印象筆記記錄過一段時間,但用了一段時間後,發現每當腦子突然靈光一閃,有好的 idea 並想記錄下來時,然而印象筆記並沒有開啟,接著自己又懶得開啟來記錄了。為了避免再次發生這種事情,我通過 notes + applescript + alfred 來實現一個速記事情工作流:

on alfred_script(q)
	tell application "Notes"
		tell account "iCloud"
			tell (current date) to get (its year as integer) & "-" & (its month as integer) & "-" & day
			set dataText to the result as text
			set mailTitle to dataText & "-速記"
			make new note at folder "PANote" with properties {name:mailTitle, body:q}
		end tell
	end tell
end alfred_script
複製程式碼

這段 applescript 的意思是把 alfred 獲取到內容,儲存到 PANote 檔案下。現在我們實現了快速記錄的功能後,我們還需要快速來查詢,我們也是通過 applescript + alfred 來實現:

use framework "Foundation"

property NSRegularExpressionSearch : a reference to 1024
property NSString : a reference to current application's NSString
property NSJSONSerialization : a reference to current application's NSJSONSerialization
property NSUTF8StringEncoding : a reference to current application's NSUTF8StringEncoding

on run argv
	set output to {}
	tell application "Notes"
		set folderNames to name of folders in default account
		repeat with folderIndex from 1 to number of folders in default account
			set folderName to item folderIndex of folderNames
			if folderName is "PANote" then
				set currentFolder to (a reference to item folderIndex of folders in default account)
				set noteIDs to id of notes of currentFolder
				set noteNames to name of notes of currentFolder
				set noteBodies to body of notes of currentFolder
				repeat with i from 1 to count of noteIDs
					set noteBody to (NSString's stringWithString:(item i of noteBodies))
					set noteBody to (noteBody's stringByReplacingOccurrencesOfString:"<[^>]*>|
" withString:" " options:NSRegularExpressionSearch range:{0, noteBody's |length|()})
					set noteBody to (noteBody's stringByReplacingOccurrencesOfString:"^ +| +$| +(?= )|" withString:"" options:NSRegularExpressionSearch range:{0, noteBody's |length|()}) as text
					set match to (item i of noteNames) & " " & folderName & " " & noteBody
					if length of noteBody is less than 100 then
						set subtitle to noteBody
					else
						set subtitle to text 1 thru 100 of noteBody
					end if
					set subtitle to folderName & "  |  " & subtitle
					set end of output to {title:(item i of noteNames), arg:(item i of noteIDs), subtitle:subtitle, match:match, uid:(item i of noteNames)}
				end repeat
			end if
		end repeat
	end tell
	
	set output to {|items|:output}
	set output to NSJSONSerialization's dataWithJSONObject:output options:0 |error|:(missing value)
	set output to (NSString's alloc()'s initWithData:output encoding:NSUTF8StringEncoding) as text
	return output
end run
複製程式碼

這裡的程式碼看起來非常多,其實原理非常簡單,首先遍歷 default account 下的所有資料夾,然後找到 PANote 這個資料夾,把查詢到的內容格式化後傳給 output,alfred 會幫我們把 output 的內容以列表形式展示出來。當我們選中展示中的內容時,我們還需要在 Notes 裡面開啟相應的內容,故我們再實現一個開啟 Notes 的指令碼:

on alfred_script(q)
	tell application "Notes"
		show note id q
	end tell
end alfred_script
複製程式碼

需要注意的是,這個方法 id 引數是從上一段程式碼中的:

output to {title:xxxx, arg:xxxx, subtitle:xxxx, match:xxxx, uid:xxxx}
複製程式碼

arg 裡面獲取的,這個是 alfred 定義的格式,我們無須關心他是如何實現的,只要按照 alfred 的規範來傳參就可以了。

自動拉程式碼並編譯

每天早上我到公司的時候,首先是去洗杯打水,然後拉程式碼編譯,接著等待漫長的編譯時間,日復一日,風雨無阻~~但在某個發呆的瞬間,突然有一個想法,為啥不讓系統在我到公司前把程式碼編譯好呢,我到公司的時候就可以直接工作,不用等待漫長的編譯過程了。

有了這種想法,就要動手去做,我們把任務一步步地拆分,首先是拉程式碼,在拉程式碼前,我們需要先檢查倉庫是否乾淨,然後默默寫下以下指令碼:

checkGitWorkspaceClean() {
    echo "Action - checkGitWorkspaceClean"

    if [ $# -lt 1 ]; then
        echo "One param is required - the check dir.";
        exit 1;
    fi

    if [ ! -d $1 ]; then
        echo "The dir does not exist - $1";
        exit 1;
    fi

    currentDir=`pwd`
    cd $1

    result=`git status -s`
    if [ -n "$result" ]; then
        echo "The git workspace is not clean - $1"
        exit 1
    fi

    cd $currentDir
}
複製程式碼

這裡通過 git status -s 命令來判斷當前倉庫是否是可拉取程式碼狀態,如果不可拉取就直接退出。

接著下一步是拉取當前所有分支的最新程式碼,我們需要獲取分支名並拉取該分支的最新程式碼:

pullLatestCode() {
    echo "Action - pullLatestCode"

    if [ $# -lt 1 ]; then
        echo "One param is required - the check dir.";
        exit 1;
    fi

    if [ ! -d $1 ]; then
        echo "The dir does not exist - $1";
        exit 1;
    fi

    currentDir=`pwd`
    cd $1

    currentBranch=`git branch | grep "*"`
    currentBranch=${currentBranch/* /}

    `git pull git pull --rebase origin ${currentBranch}`

    cd $currentDir
}
複製程式碼

有沒有覺得這些程式碼很熟悉,其實在 shell 那節都有介紹過的,這裡只是把上面說的內容應用到實際的場景中而已。

拉取完成程式碼後,我們就可以通過 xcodebuild 編譯程式碼,xcodebuild 引數可以參考 apple 官方幫助文件,這裡你預設使用模擬器進行編譯:

buildProject() {
    echo "Action - pullLatestCode"

    if [ $# -lt 1 ]; then
        echo "One param is required - the check dir.";
        exit 1;
    fi

    if [ ! -d $1 ]; then
        echo "The dir does not exist - $1";
        exit 1;
    fi

    currentDir=`pwd`
    cd $1

    xcodebuild -workspace ${PARS_PROJECT_NAME}.xcworkspace -scheme ${PARS_PROJECT_NAME} -sdk iphonesimulator build

    cd $currentDir
}
複製程式碼

這樣我們整個拉取和編譯流程都可以通過程式碼來實現了,但是在編譯程式碼前,應該先檢查下倉庫是否有衝突,如果有衝突就不開始編譯,所以正確的流程是:

checkGitWorkspaceClean $PARS_PROJECT_DIR
pullLatestCode $PARS_PROJECT_DIR
checkGitWorkspaceClean $PARS_PROJECT_DIR
buildProject $PARS_PROJECT_DIR
複製程式碼

當不能正常完成編譯時,可以通過 AppleScript 顯示一些視覺化的提示,比如彈窗之類的,這一些優化依據個人習慣新增就可以,不過多講解。

如果你覺得在終端編譯不夠直觀,無法直接看到編譯進度,我們則可以通過 AppleScript 來優化程式碼編譯流程,直接呼叫 Xcode 來編譯或者執行程式碼:

tell application "Xcode"
	open "/Users/xxxxx/xxxx/xxxxx/xxxxx.xcworkspace"
	set workspaceDocument to workspace document "xxxxx.xcworkspace"
	repeat 120 times
		if loaded of workspaceDocument is true then
			exit repeat
		end if
		delay 1
	end repeat
	if loaded of workspaceDocument is false then
		error "Xcode workspace did not finish loading within timeout."
	end if
	set actionResult to run workspaceDocument
	repeat
		if completed of actionResult is true then
			exit repeat
		end if
		delay 1
	end repeat
end tell
複製程式碼

到這,已經把最關鍵的拉取和編譯程式碼的功能講完,至於如何定時執行,在上文已經詳細介紹過,這裡不重複講解。但是定時任務存在一個不太方便的問題,就是當你電腦關機或者休眠時,這個定時任務就不會啟動。設定電腦一直待機不休眠也不太好,畢竟公家財產也是要愛護的,比較折中的方法是把這個指令碼寫成 alfred 的 workflows,我們到公司時,可以先花 1-2 秒時間來執行這個 workflows,然後再去洗杯打水吃早餐之類的,等你把亂七八糟的事情搞定了,程式碼也快編譯好了。

集思廣益

在給團隊成員分享的過程中,隊友們就自動拉程式碼並編譯時機方面,提出了更好的方案:每天晚上12點(大家都下班的時候)時執行指令碼,執行完成後通過指令碼讓電腦休眠,從而避免電腦長時間待機。

總結

本文簡單分享如何通過工具,來處理日常工作中遇到的一些煩瑣的事情 ,通過使用指令碼等方式來實現自動化,從而提升個人的工作效率。這裡僅提供一個思路和一些例子,至於如何發揮,就得看你自己如何去使用這些工具了,總之,工具是越用越合手的。

我的小專欄 ,如果喜歡,可以訂閱一波。

相關文章