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

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

本文大部內容是基于 MacOS 環(huán)境的,非 Mac 黨也可以借鑒其中的一些思想。

Shell Script

Shell 與 Shell Script

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

Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統(tǒng)內核的服務。

Shell 腳本(Shell Script),是一種為 Shell 編寫的腳本程序。

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

常用串聯(lián)命令

管道

管道是 shell 中非常常用的功能之一,它允許不同腳本、命令之間互相傳遞數據,例如:

ls | grep 'pars'

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

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

重定向

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

命令 說明
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

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

我們可以在在電腦開機時設置自啟動任務。首先我需要創(chuàng)建一個 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 指定開機后只執(zhí)行一次,不指定則每隔一段時間就會執(zhí)行一次。Label 指定該 plist 的唯一標識。ProgramArguments 則是設置執(zhí)行腳本的路徑,指向你想要啟動時自動執(zhí)行的腳本路徑。

完成上面操作后,把創(chuàng)建的 plist 文件拷貝到 ~/Library/LaunchAgents目錄下,表示僅對當前用戶生效,然后執(zhí)行:

sudo launchctl load ~/Library/LaunchAgents/xxxxxx.plist

將這個文件注冊到系統(tǒng)中,然后電腦啟動時就會自動執(zhí)行,完成雙網上的配置。這里有一個問題,如果啟動時自動執(zhí)行上面的雙網卡配置腳本,真的能正常運行嗎?

事實上是不行的,因為 sudo 命令需要你輸入管理員密碼,但你并沒有地方輸入,所以是沒有權限進行這些操作的。故我們需要用到 Apple Script,從而引出下一節(jié)的內容,這里先附上 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 來提供一個圖形界面來要求用戶先輸入管理員密碼,才允許他繼續(xù)執(zhí)行腳本。腳本使用了 Apple Script,故開機啟動項的 plist 的文件也要做相應的變化:

<key>ProgramArguments</key>
<array>
    <string>osascript</string>
    <string>/Users/xxxx/work/Tools/xxxx.scpt</string>
</array>

關于 Apple Script 的內容將在下一節(jié)詳細介紹,這里我們先思考一個問題:設置開機執(zhí)行后,就能解決上面說的痛點了嗎?

事實上并不能解決所有問題,比如說,開機的時候外置網卡沒有插上,那么自動執(zhí)行的腳本就會配置失敗,這時就又回到最初的場景,需要我們去找到這個腳本文件,然后通過終端執(zhí)行。那么我們可以怎么去優(yōu)化這個流程呢?我們帶著這個問題,繼續(xù)后面的內容,然后來再回來解決它。

集思廣益

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

echo password | sudo -S xxxxxxxxx

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

Apple Script

Apple Script 是什么?

AppleScript 是 Apple 創(chuàng)建的腳本語言,用于自動執(zhí)行 Macintosh 操作系統(tǒng)及其許多應用程序操作的語言。可以用來控制運行于 macOS 上的程序,以及 macOS 本身的部分內容。你可以創(chuàng)建腳本來自動執(zhí)行重復性任務,或組合多個可編寫腳本的應用程序的功能來創(chuàng)建復雜的工作流程。

我們使用 AppleScript 創(chuàng)建備忘錄、管理網絡、處理圖像、備份文件等等,AppleScript 是功能非常強大的自動化工具,它內置于 macOS 系統(tǒng)中,通過 腳本編輯器 應用來編寫和運行,任何用戶都可以免費使用它。

腳本編輯器

macOS 中默認已經提供編寫 AppleScript 的工具:腳本編輯器,我們可以通過應用程序中找到并啟動它。

01.png

我們第一個 AppleScript 腳本

我們打開腳本編輯器并選擇新建文稿,輸入以下內容:

tell application "Finder" to open the startup disk

點擊運行后,系統(tǒng)會在桌面打開一個新的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

實踐出真知

匯報郵件提醒&自動生成

下面我們直接開始實操,來實現一個自動提醒發(fā)送重點項目進度的工具,除了提醒功能外,該工具還會自動幫你創(chuàng)建郵件模塊,包括收件人、主題、內容模板等,我們來看實現腳本:

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 "又到周一了,趕緊發(fā)重點項目進度" buttons {"現在發(fā)", "一會發(fā)"} default button 1
if the button returned of the result is "現在發(fā)" then
    callback()
end if

這里我們通過 AppleScript 訪問 Microsoft Outlook 并自動生成郵件模板,以上腳本只給郵件內容填充了模塊,但實際上還可以實現自動把你的重點項目進度excel統(tǒng)計表附件進來,再進一步的話,可以直接通過 AppleScript 讀取 excel 的內容,然后填充到郵件內容中,只要你在完成重點項目內容后,及時更新 excel 統(tǒng)計表中的內容,那么到每周一發(fā)重點項目的時候,你只需要一個命令就可以自動完成匯報郵件。

我們完成了自動生成郵件模板的功能后,還需提供自動提醒的功能,關于自動提醒功能,我們可以使用 mac 的啟動服務來實現,和自動配置雙網上的方式一模一樣,我們創(chuàng)建相應的 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 是用來控制你腳本的執(zhí)行周期或者時間的,這里設置為每周一上午 10:30 時就會自動執(zhí)行腳本。

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

推薦閱讀

  1. Mac Automation Scripting Guide

Automator

Automator 是什么?

02.png

Automator 是蘋果公司為 macOS 系統(tǒng)開發(fā)的一款軟件,只要通過點擊拖拽鼠標等操作就可以將一系列動作組合成一個工作流程,從而幫助你自動的(可重復的)完成一些復雜的工作。Automator 實際上是一些列動作組合在一個工作流文檔里,然后按順序去執(zhí)行這些動作,與我們上面所以說的腳本非常類似,但 Automator 可以橫跨多個程序進行,并提供圖形界面進行操作,用戶操作起來非常方便。

腳本轉應用

關于 Automator,我們可以通過實現腳本轉應用的例子進行了解,首先我們打開 macOS 自帶的 Automator,選新建文稿-->應用程序-->實用工具-->運行xxx腳本,然后把你的腳本填寫進去,然后保存生成一個應用。生成的應用默認是 Automator 的圖標,如果你想去改變圖標,則可以右擊應用—>顯示包內容-->Contents-->Resources,然后把 AutomatorApplet.icns 替換成你想要的圖標就可以了。

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

推薦閱讀

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

Alfred & WorkFlows

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

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

自我學習

這里省略成千上萬的字,需要你自行去學習 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,用來快速執(zhí)行該腳本:

05.png

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

速記大法

每次開周會時,在一周回顧環(huán)節(jié)中,總是拼命回顧這周我做了那些事情,特別是分享亮點和不足的時候,就各種詞窮。這里介紹一個非常有效的方法,就是每天記一記,周會不糾結。其實這個方法大家都知道,只是大家都懶得記,或者是沒有找到一個好的工具,我曾經用印象筆記記錄過一段時間,但用了一段時間后,發(fā)現每當腦子突然靈光一閃,有好的 idea 并想記錄下來時,然而印象筆記并沒有打開,接著自己又懶得打開來記錄了。為了避免再次發(fā)生這種事情,我通過 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 的規(guī)范來傳參就可以了。

自動拉代碼并編譯

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

有了這種想法,就要動手去做,我們把任務一步步地拆分,首先是拉代碼,在拉代碼前,我們需要先檢查倉庫是否干凈,然后默默寫下以下腳本:

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 命令來判斷當前倉庫是否是可拉取代碼狀態(tài),如果不可拉取就直接退出。

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

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 那節(jié)都有介紹過的,這里只是把上面說的內容應用到實際的場景中而已。

拉取完成代碼后,我們就可以通過 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 顯示一些可視化的提示,比如彈窗之類的,這一些優(yōu)化依據個人習慣添加就可以,不過多講解。

如果你覺得在終端編譯不夠直觀,無法直接看到編譯進度,我們則可以通過 AppleScript 來優(yōu)化代碼編譯流程,直接調用 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

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

集思廣益

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

總結

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容