Mac 下的軟件安裝 —— 從 pkg,dmg 到 brew,cask

轉(zhuǎn)載來(lái)之原作者Elsewhere**

http://col.dog/2015/11/22/homebrew/

Mac 下的軟件安裝 —— 從 pkg,dmg 到 brew,cask
發(fā)表于 2015-11-22
| 分類于 Mac |

本文前驅(qū)鋪墊梳理了從 linux 源碼安裝軟件到 DPKG/RPM 軟件包管理機(jī)制冲泥,闡述了 *UNX 平臺(tái)的軟件安裝包管理機(jī)制的演變和現(xiàn)代化。后半部分介紹了 Mac 下的軟件安裝包格式 —— pkg & dmg哑姚,以及軟件包管理工具 —— brew 及 brew-cask,并梳理日常 Command Usage缀踪。
linux 軟件的安裝與管理
linux 是一套免費(fèi)使用和自由傳播的基于 POSIX 和 UNIX 的多用戶井氢、多任務(wù)瞒御、支持多線程和多 CPU 的開源的類 Unix 操作系統(tǒng)延窜。由于 linux 操作系統(tǒng)開放源代碼,因而在其上安裝的大部分也都是開源軟件。開源軟件的開發(fā)者往往僅需在開源代碼托管平臺(tái)上發(fā)布一份源碼包悠咱,用戶即可自由下載源碼包到本地,基于源碼包編譯安裝軟件蔗草。這倒是非常符合 C 語(yǔ)言的設(shè)計(jì)哲學(xué):一次編寫零远,到處編譯。
基于源碼安裝軟件
基于源碼安裝軟件一般由以下幾個(gè)步驟組成:
下載解壓源碼
閱讀 README正驻、INSTALL 等說(shuō)明文檔弊攘,這一步至關(guān)重要
分析安裝平臺(tái)環(huán)境(ifconfigure)
編譯安裝軟件(make,make install)

基于源代碼安裝軟件的好處是:用戶可以自由配置編譯選項(xiàng)姑曙,按需編譯實(shí)現(xiàn)功能定制肴颊,極大地滿足個(gè)性化需求。此外渣磷,用戶還可以自己選擇安裝路徑婿着,方便管理。卸載軟件也很方便醋界,只需刪除對(duì)應(yīng)的安裝目錄即可竟宋。但是,配置形纺、編譯命令需要了解操作系統(tǒng)本身丘侠,并且依賴開源項(xiàng)目所使用的編程語(yǔ)言對(duì)應(yīng)的工具鏈。為了使用一個(gè)應(yīng)用軟件逐样,用戶需要熟悉 linux 系統(tǒng)的文件組織架構(gòu)和一堆 Shell 交互命令蜗字,還得解決編譯過(guò)程中可能涉及到的繁雜的依賴關(guān)系。一定的英文水平也是必需的脂新,關(guān)鍵是要有折騰不息的精神和頑強(qiáng)的動(dòng)手能力挪捕!English、OS争便、Linux级零、命令行交互方式、…滞乙,這些令人望而卻步的門檻足以將普通用戶拒之門外奏纪。安裝后,你可能都不知道安裝到哪里去了斩启;甚至離開了 Windows 桌面序调,你都不知道從哪里啟動(dòng)軟件。我依稀地記得剛接觸 linux 那會(huì)兒兔簇,為了能在 linux 上播放個(gè)視頻文件发绢,廢了老大勁才安裝好一個(gè) MPlayer硬耍。當(dāng)時(shí)就森森地覺(jué)得 linux 真不是一般人能折騰得起,盡管現(xiàn)在已經(jīng)折騰慣了朴摊,但依然覺(jué)得費(fèi)腦傷神默垄。作為一個(gè)曾經(jīng)的計(jì)算機(jī)旁系學(xué)生(自動(dòng)化,別名計(jì)算機(jī)控制)甚纲、現(xiàn)在的半職業(yè)化軟件攻城獅(涉獵甚廣口锭,淺顯浮泛)和偽自由軟件追崇者(用過(guò)盜版,不懂破解介杆,從無(wú)貢獻(xiàn))鹃操,因?yàn)楣ぷ麝P(guān)系經(jīng)常穿梭于 Windows 和 Mac OS X 之間(游離其間,無(wú)所專精)春哨,不折騰下 Linux/Unix 都覺(jué)得沒(méi)法混 github荆隘。盡管對(duì)于 vim 鍵盤型用戶(估計(jì)基本都是程序員吧),很喜歡那種游離于指尖的”自由感”赴背,但對(duì)于普通鼠標(biāo)型 Windows 用戶椰拒,若無(wú)力駕馭,自由便是負(fù)擔(dān)凰荚。
只有開發(fā)人員才需要學(xué)習(xí)一個(gè)操作系統(tǒng)本身燃观,用戶只需要學(xué)習(xí)操作系統(tǒng)里面的每個(gè)“應(yīng)用程序”怎么使用”闵—— Linus Torvalds

DPKG / RPM
伴隨著 linux 的發(fā)展普及缆毁,linux 開發(fā)商開始在固定的硬件平臺(tái)與操作系統(tǒng)上將要安裝或升級(jí)的軟件編譯好,然后將這個(gè)軟件的所有相關(guān)文件打包成一個(gè)特殊格式的文件到涂。在這個(gè)軟件內(nèi)脊框,還包含了預(yù)先檢測(cè)系統(tǒng)與依賴軟件(或動(dòng)態(tài)鏈接庫(kù))的腳本,并提供記載該軟件提供的所有文件信息等践啄,最終將這個(gè)軟件發(fā)布浇雹。客戶端取得軟件后往核,只要通過(guò)特定的命令來(lái)安裝箫爷,那么該軟件就會(huì)按照內(nèi)部的腳本來(lái)檢測(cè)相關(guān)的前驅(qū)軟件是否存在。若安裝的環(huán)境和條件符合要求聂儒,則開始安裝。軟件在安裝完成后硫痰,還會(huì)將信息寫入軟件管理機(jī)制中衩婚,以便完成未來(lái)的升級(jí)、刪除(反安裝)等操作效斑。
目前非春,在 Linux 界最常見(jiàn)的軟件安裝方式有兩種:
DPKG
DPKG(Debian Packager)是由 Debian Linux 社區(qū)所開發(fā)出來(lái)的,著名的 package
概念由此被引入到 GNU/Linux 系統(tǒng)中。
通過(guò) DPKG 機(jī)制奇昙,Debian 提供的軟件就能夠簡(jiǎn)單安裝起來(lái)护侮,同時(shí)還能提供安裝后的軟件信息。派生于 Debian 的其他 Linux Distributions 大多使用 dpkg 機(jī)制來(lái)管理軟件储耐,包括 B2D羊初、UbuntuLinux Mint 等什湘。
Debian 為解決軟件包更新問(wèn)題长赞,引入了 APT(Advanced Package Tool)在線升級(jí)機(jī)制,并在 /etc/apt/sources.list
文件列出了可獲得軟件包的鏡像站點(diǎn)地址闽撤。APT 由幾個(gè)名字以 apt-
打頭的程序組成得哆,apt-get、apt-cache 和 apt-cdrom 是處理軟件包的命令行工具哟旗。
apt 作為 dpkg 的前端工具贩据,自動(dòng)管理關(guān)聯(lián)文件和維護(hù)已有配置文件,擁有出色的解決軟件依賴問(wèn)題的能力闸餐。

RPM
RPM(RedHat Package Manager)是由 Red Hat 公司所開發(fā)出來(lái)的軟件包管理程序饱亮。除了可以用來(lái)安裝(-i)外,還可以進(jìn)行查詢(-q)绎巨、驗(yàn)證(-V)近尚、更新(-U)、刪除(-e)等操作场勤,這些功能選項(xiàng)讓軟件的管理更加方便戈锻。包括 FedoraCenterOS和媳、SUSE/openSUSE 等知名的 linux 發(fā)行版本都使用 RPM 作為軟件安裝的管理機(jī)制格遭。
RPM 包的封裝格式一般有兩種,分別是 RPMSRPM留瞳。RPM 格式的文件 xxx.rpm
內(nèi)含已經(jīng)經(jīng)過(guò)編譯的二進(jìn)制包和配置文件等數(shù)據(jù)拒迅。SRPM(Source RPM)對(duì)應(yīng)的 RPM 文件類似于 xxx.src.rpm
格式,它包含了源碼文件和一些編譯指定的參數(shù)文件她倘。因而璧微,在使用的時(shí)候,需要先以 RPM 管理的方式編譯為 RPM 文件(rpmbuild硬梁,再將編譯完成的 RPM 文件安裝到 Linux 系統(tǒng)中前硫。
RPM 無(wú)法自動(dòng)解決軟件的依賴關(guān)系,使用與 APT 對(duì)應(yīng)的 YUM (Yellowdog Updater Modified) 機(jī)制可以解決屬性依賴問(wèn)題荧止。YUM 作為基于 RPM 的 Shell 前端軟件包管理器屹电,主要用于自動(dòng)升級(jí)阶剑、安裝/移除 RPM 軟件包。它能夠自動(dòng)查找并解決 RPM 包之間的依賴關(guān)系危号,而無(wú)需管理員逐個(gè)手工的去安裝每一個(gè) RPM 包牧愁。

Distribution 代表
包管理機(jī)制
使用命令
在線升級(jí)機(jī)制(命令)

Red Hat / Fedora
RPM
rpm,rpmbuild
YUM(yum)

Debian / Ubuntu
DPKG
dpkg
APT(apt-get)

linux 眾多發(fā)行版中外莲,ubuntu 占領(lǐng)桌面猪半,RHEL/CentOS 占領(lǐng)服務(wù)器,比較小眾的 Gentoo 采用獨(dú)特的 Portage包管理系統(tǒng)苍狰。Gentoo 的軟件樹稱為 Portage办龄,對(duì)應(yīng)的包管理器是 emerge,包元文件稱為 ebuild淋昭。Gentoo 是個(gè)強(qiáng)調(diào)能自由選擇的分發(fā)版俐填,它使用源碼來(lái)做包管理的方式。由于能自己編譯及調(diào)整源碼依賴等選項(xiàng)翔忽,而獲得至高的自定義性及優(yōu)化的軟件英融,在源碼包也有相當(dāng)多新舊版本的選擇,因此吸引了許多狂熱愛(ài)好者以及專業(yè)人士歇式。
RPM / SRPM
RPM 軟件包命名規(guī)范:name-version-release.arch.rpm
驶悟。其中,version
表示系統(tǒng)的發(fā)行版材失,如 fc18痕鳍、el6 表明這個(gè)軟件包是在 Fedora 18、RHEL 6.x / CentOS 6.x 下使用的龙巨;arch
表示硬件平臺(tái)笼呆,常見(jiàn)的有 i386、x86_64 等旨别。
**rp-pppoe-3.1-5.i386.rpm
** 是一個(gè)典型的 RPM 安裝包诗赌,它由幾個(gè)部分構(gòu)成:
rp-pppoe
:名稱
3.1
:版本信息
5
:發(fā)布次數(shù)
.i386
:適合的硬件平臺(tái)
.rpm
:擴(kuò)展名

RPM 文件必須要在相同的 linux 環(huán)境才能安裝,而 SRPM 是源代碼格式秸弛。我們可以通過(guò)修改 SRAM 內(nèi)的參數(shù)铭若,按需編譯生成適合我們 linux 環(huán)境的 RPM 文件,而不必與原作者打包的 Linux 環(huán)境相同递览。通常一個(gè)軟件在發(fā)布的時(shí)候叼屠,都會(huì)同時(shí)釋放出該軟件的 RPM 與 SRPM。
文件格式
擴(kuò)展名格式
直接安裝與否
內(nèi)含程序類型
可否修改參數(shù)并編譯

RPM
xxx.rpm


已編譯
×

SRPM
xxx.src.rpm

×
未編譯的源碼

RPM 建包的原理并不復(fù)雜绞铃,可以理解為按照標(biāo)準(zhǔn)的格式整理一些信息环鲤,包括:軟件基礎(chǔ)信息,以及安裝憎兽、卸載前后執(zhí)行的腳本冷离,對(duì)源碼包解壓、打補(bǔ)丁纯命、編譯西剥,安裝路徑和文件等。我們可以基于標(biāo)準(zhǔn)規(guī)范亿汞,來(lái)使用 rpmbuild 制作自己的 RPM 包瞭空。
Mac 軟件包管理工具
linux 平臺(tái)下的 apt-get 和 yum 命令行工具分別適用于 deb、rpm 包管理方式的發(fā)行版本疗我,主要用于自動(dòng)從互聯(lián)網(wǎng)的軟件倉(cāng)庫(kù)中搜索咆畏、安裝、升級(jí)和卸載軟件吴裤。在 Mac OS X 平臺(tái)下旧找,除了直接從 AppleStore 下載認(rèn)證上架的軟件進(jìn)行安裝外,還可以在系統(tǒng)偏好設(shè)置的【安全性與隱私】中允許從任何來(lái)源下載的應(yīng)用麦牺。
dmg & pkg
一些應(yīng)用會(huì)提供 dmg钮蛛、pkg 安裝包,例如 git-2.5.3-intel-universal-mavericks.dmg
剖膳、Subversion-1.9.2_10.10.x.pkg
魏颓。
dmg 是蘋果的壓縮鏡像文件(類似 Windows 下的 iso ),它是 Mac 應(yīng)用軟件通用的打包格式(相當(dāng)于 ipa)吱晒,里面一般包含 應(yīng)用程序.app
的圖標(biāo)和一個(gè)應(yīng)用程序文件夾(/Applications
)快捷方式甸饱,直接將 應(yīng)用程序.app
拖曳至應(yīng)用程序文件夾即可完成安裝。卸載也同樣綠色仑濒,直接在 Launchpad
中或 cd 到 /Applications
目錄下刪除應(yīng)用(文件夾)即可叹话。
pkg 屬于系統(tǒng)級(jí)軟件的安裝程序,相當(dāng)于 iOS 越獄后裝的 deb躏精,一般會(huì)修改系統(tǒng)配置渣刷,權(quán)限較高。pkg 安裝一般要求 sudo 授權(quán)矗烛,卸載 pkg 安裝的應(yīng)用 也比較麻煩辅柴。pkg 類似 Windows 下的安裝程序 Setup.exe 和 *.msi。Windows 下可以使用 Install Shield 來(lái) 制作安裝程序瞭吃,可使用 Xcode 自帶的 PackageMaker 或打包命令行工具 pkgbuild+productbuild+pkgutilIceberg(an Integrated Packaging Environment (IPE) )來(lái)制作安裝包碌嘀。
mpkg:pkg 是單個(gè)應(yīng)用程序的安裝包,而 mpkg(multi pkg)是多個(gè) pkg 歪架。我們來(lái)看一下從 AppleStore 下載的 OS X EI Capitan 安裝器文件——安裝 OS X EI Capitan.app
的 /Contents/SharedSupport
目錄:
faner@MBP-FAN:/Applications/Install OS X El Capitan.app/Contents/SharedSupport|? tree .├── InstallESD.dmg└── OSInstall.mpkg0 directories, 2 files

下載完 安裝 OS X EI Capitan.app
之后股冗,可以使用 **createinstallmedia
** 命令制作 U 盤安裝盤,或恢復(fù)到 U 盤制作啟動(dòng)盤和蚪。

dmg with pkg:像 git-2.5.3-intel-universal-mavericks.dmg
這種 dmg 打包的是 git command CLI 的安裝 pkg止状,需要使用 DiskImageMounter 掛載 dmg烹棉,然后打開 pkg(使用 Installer),按照引導(dǎo)一步步 next 即可安裝完成怯疤。當(dāng)然也可使用 命令行 完成掛載安裝操作浆洗。

除了使用 dmg、pkg 來(lái)安裝軟件外集峦,Mac 下同樣有優(yōu)秀的軟件包管理工具伏社,可以下載、安裝和管理大量 AppleStore 沒(méi)有提供塔淤、而又經(jīng)常會(huì)用到的開源軟件摘昌。我們有兩種選擇 —— MacPorts 和 Homebrew。
MacPorts
MacPorts (DarwinPorts) 是由 FreeBSD 的 port 移植而來(lái)的軟件包管理系統(tǒng)高蜂,聪黎,用來(lái)簡(jiǎn)化 Mac OS X和 Darwin 操作系統(tǒng)上軟件的安裝。在 Mac 中安裝 MacPorts 讓你在Mac 的 Shell 下更加游刃有余妨马。MacPorts 有個(gè)原則挺举,對(duì)于軟件包之間的依賴,都在 MacPorts 內(nèi)部(/opt/local
)解決烘跺,無(wú)論系統(tǒng)本身是否包含了需要的庫(kù)湘纵,都不會(huì)加以利用。這使得 MacPorts 龐大臃腫滤淳,導(dǎo)致系統(tǒng)出現(xiàn)大量軟件包的冗余梧喷,占用不小的磁盤空間,同時(shí)稍大型一點(diǎn)的軟件編譯時(shí)間都會(huì)難以忍受脖咐。
Homebrew
Homebrew(簡(jiǎn)稱 brew)是 Mac OS X 不可或缺的軟件管理工具(The missing package manager for OS X)铺敌,讓 Mac 擁有類似 apt-get 的功能,用以簡(jiǎn)化軟件的安裝屁擅、升級(jí)和卸載過(guò)程偿凭。
Homebrew is the easiest and most flexible way to install the UNIX tools.

Homebrew 是一款使用 Ruby 進(jìn)行開發(fā)的托管于 GitHub 上的自由及開放源代碼的軟件包管理系統(tǒng),通過(guò)用戶的貢獻(xiàn)擴(kuò)大對(duì)軟件包的支持派歌。
MacPorts vs Homebrew
MacPorts 和 Homebrew 這兩種包管理系統(tǒng)的工作方式都是下載源代碼弯囊,然后在本地編譯。但是這兩種包管理系統(tǒng)還是存在很大差異的胶果,主要差異有以下三點(diǎn):
MacPorts 的理念是盡量減少對(duì)系統(tǒng)現(xiàn)有庫(kù)的依賴匾嘱,編譯時(shí)間較長(zhǎng);而 Homebrew 則是盡量依賴系統(tǒng)現(xiàn)有庫(kù)早抠,編譯時(shí)間會(huì)顯著減少霎烙。
MacPorts 的 Package 是安裝到 /opt/local
,不會(huì)與系統(tǒng)現(xiàn)有的軟件發(fā)生沖突;而 Homebrew 的 Package 是安裝到 /usr/local
悬垃,可能與系統(tǒng)自帶的軟件發(fā)生沖突游昼。
Macports 使用 rsync 進(jìn)行同步(也可以使用svn),而 Homebrew 使用 git 進(jìn)行同步盗忱。

總體來(lái)說(shuō)酱床,Homebrew 使用簡(jiǎn)單,編譯時(shí)間短趟佃,比較適合新手使用。MacPorts 編譯時(shí)間長(zhǎng)昧捷,命令還要帶上 sudo闲昭,易用性上沒(méi)有 Homebrew 好,但是比較干凈靡挥,適合有潔癖的人使用序矩。
以上梳理了 Linux 和 Mac 下的包管理機(jī)制,下面重點(diǎn)介紹 Mac OS X 上的包管理 CLI 命令行工具 brew 及其增強(qiáng)工具 brew-cask跋破。
brew (homebrew)
brew 是從軟件包倉(cāng)庫(kù)下載源代碼碼到本地進(jìn)行解壓簸淀,進(jìn)而執(zhí)行 ./configure
&& make install
,將軟件編譯安裝到單獨(dú)的目錄(/usr/local/Cellar
)下毒返,然后軟鏈(symlink)到 /usr/local
目錄下租幕,同時(shí)會(huì)自動(dòng)檢測(cè)下載相關(guān)依賴庫(kù),并自動(dòng)配置好各種環(huán)境變量拧簸。這個(gè)對(duì)程序員來(lái)說(shuō)簡(jiǎn)直是福音劲绪,使用簡(jiǎn)單的指令就能快速安裝、升級(jí)和卸載本地的各種開發(fā)環(huán)境盆赤。
安裝 brew
brew 的安裝很簡(jiǎn)單贾富,使用一條 ruby 命令調(diào)用 curl 下載安裝即可。
1.Mac OS X 上默認(rèn)已安裝 ruby
faner@MBP-FAN:~|? ruby -vruby 2.0.0p645 (2015-04-13 revision 50299) [universal.x86_64-darwin15]

2.Mac OS X 上默認(rèn)已內(nèi)置了 curl(Command Line URL Viewer):
faner@MBP-FAN:~|? curl --versioncurl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets

說(shuō)明:
curl 是基于跨平臺(tái)網(wǎng)絡(luò)協(xié)議庫(kù) libcurl 的利用 URL 語(yǔ)法在命令行方式下工作的開源文件傳輸工具牺六。curl常用命令 可參考 curl 詳解颤枪、curl網(wǎng)站開發(fā)指南

舊的安裝
很早之前淑际,homebrew 的安裝 url 是 https://raw.github.com/Homebrew/homebrew/go/install

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

首次執(zhí)行 brew install
安裝軟件時(shí)畏纲,將提示不能創(chuàng)建 /usr/local/Cellar
目錄,原因是沒(méi)有 /usr/local
的寫權(quán)限庸追。
? ~ brew install nodeError: Could not create /usr/local/CellarCheck you have permission to write to /usr/local

解決方法
執(zhí)行 chown
命令改變 /usr/local
的所有者為 whoami
霍骄,-R
表示遞歸(Recursive)。

? ~ whoamifaner? ~ sudo chown -R faner /usr/local

新的安裝
可以在 brew 的官網(wǎng)首頁(yè)的末尾看到最新的安裝代碼:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

最新的安裝過(guò)程中將會(huì)要求輸入密碼授權(quán) sudo chown ${whoami} /usr/local/*

~ $ brew-bash: brew: command not found~ $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"==> This script will install:/usr/local/bin/brew/usr/local/Library/.../usr/local/share/man/man1/brew.1==> The following directories will be made group writable:/usr/local/./usr/local/bin/usr/local/include/usr/local/lib/usr/local/lib/pkgconfig==> The following directories will have their owner set to thomasfan:/usr/local/./usr/local/bin/usr/local/include/usr/local/lib/usr/local/lib/pkgconfig==> The following directories will have their group set to admin:/usr/local/./usr/local/bin/usr/local/include/usr/local/lib/usr/local/lib/pkgconfigPress RETURN to continue or any other key to abort==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/. /usr/local/bin /usr/local/include /usr/local/lib /usr/local/lib/pkgconfigPassword:==> /usr/bin/sudo /usr/sbin/chown thomasfan /usr/local/. /usr/local/bin /usr/local/include /usr/local/lib /usr/local/lib/pkgconfig==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/. /usr/local/bin /usr/local/include /usr/local/lib /usr/local/lib/pkgconfig==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew==> /usr/bin/sudo /usr/sbin/chown thomasfan /Library/Caches/Homebrew==> Downloading and installing Homebrew...remote: Counting objects: 3847, done.remote: Compressing objects: 100% (3691/3691), done.remote: Total 3847 (delta 40), reused 520 (delta 21), pack-reused 0Receiving objects: 100% (3847/3847), 3.31 MiB | 105.00 KiB/s, done.Resolving deltas: 100% (40/40), done.From https://github.com/Homebrew/homebrew * [new branch] master -> origin/masterHEAD is now at e191c00 jsonnet: update 0.8.5 bottle.==> Installation successful!==> Next stepsRun brew help to get started~ $

brew help
brew -v / –version
安裝完 brew淡溯,執(zhí)行 brew -v
命令可以查看安裝的 brew 版本信息:
faner@MBP-FAN:~|? brew -vHomebrew 0.9.5 (git revision 1eec1; last commit 2015-11-21)faner@MBP-FAN:~|? brew --version0.9.5 (git revision 1eec1; last commit 2015-11-21)

brew 常用命令
執(zhí)行 brew
查看幫助概要(Example usage读整、Troubleshooting、Brewing):
-h / –h / –help / help

faner@MBP-FAN:~|? brewExample usage: brew [info | home | options ] [FORMULA...] brew install FORMULA... brew uninstall FORMULA... brew search [foo] brew list [FORMULA...] brew update brew upgrade [FORMULA...] brew pin/unpin [FORMULA...]Troubleshooting: brew doctor brew install -vd FORMULA brew [--env | config]Brewing: brew create [URL [--no-fetch]] brew edit [FORMULA...] https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Formula-Cookbook.mdFurther help: man brew brew home

執(zhí)行 man brew
可查看詳細(xì)的 brew 幫助文檔咱娶。
執(zhí)行 man home
可調(diào)用瀏覽器打開 brew 官方網(wǎng)站米间。

命令
說(shuō)明

brew update
更新 brew

brew search FORMULA
查找軟件包强品,可使用正則表達(dá)式

brew info FORMULA
顯示軟件的信息

brew deps FORMULA
顯示包依賴

brew install FORMULA
安裝軟件包

brew uninstall FORMULA
卸載軟件包

brew list
列出已安裝的軟件包,可指定 FORMULA

brew outdated
列出可升級(jí)的軟件包

brew upgrade
更新已安裝的軟件包屈糊,可指定 FORMULA

brew doctor
診斷 homebrew 環(huán)境

brew prune
刪除 /usr/local 下的無(wú)效鏈接(remove broken symlinks)

brew info
**brew info
** 顯示軟件包信息的榛,一般包括:
軟件概要信息
本地是否已安裝:Not installed / Poured from bottle
依賴包:==> Dependencies,Build逻锐、Required夫晌、Recommended、Optional
編譯昧诱、安裝選項(xiàng): ==> Options
預(yù)警信息:==> Caveats

brew info 查看 plist 文件
brew install 示例
tree
linux 下的 tree 命令以樹形結(jié)構(gòu)顯示文件目錄結(jié)構(gòu)晓淀,Mac 下默認(rèn)并沒(méi)有該命令,只有普通的 **ls
** 命令盏档⌒钻可以利用 brew 查找并安裝 tree 命令行工具:
faner@MBP-FAN:~|? brew search treegit-stree mvptree pstree tree treecc treeline homebrew/emacs/dict-tree homebrew/science/quicktree Caskroom/cask/treemaker homebrew/emacs/undo-tree homebrew/x11/prooftree Caskroom/cask/treesheets homebrew/emacs/ztree-emacs Caskroom/cask/figtree homebrew/science/fasttree Caskroom/cask/sourcetree faner@MBP-FAN:~|? brew info treetree: stable 1.7.0 (bottled)Display directories as trees (with optional color/HTML output)http://mama.indstate.edu/users/ice/tree/Not installedFrom: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/tree.rbfaner@MBP-FAN:~|? brew deps treefaner@MBP-FAN:~|? brew install tree==> Downloading https://homebrew.bintray.com/bottles/tree-1.7.0.el_capitan.bottle.1.tar.gz######################################################################## 100.0%==> Pouring tree-1.7.0.el_capitan.bottle.1.tar.gz?? /usr/local/Cellar/tree/1.7.0: 7 files, 128Kfaner@MBP-FAN:~|? tree --versiontree v1.7.0 (c) 1996 - 2014 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro

homebrew 下載已經(jīng)編譯好的二進(jìn)制包 tree 到緩存目錄 /Library/Caches/Homebrew/tree-1.7.0.el_capitan.bottle.1.tar.gz

解壓 tree-1.7.0.el_capitan.bottle.1.tar.gz
到 /usr/local/Cellar/tree/
目錄,根據(jù)版本存放到文件夾 1.7.0
下蜈亩。
將 /usr/local/Cellar/tree/1.7.0/bin/tree
軟鏈到 /usr/local/bin/tree
懦窘,后者是前者的替身,執(zhí)行 tree 命令時(shí)稚配,真正調(diào)用的是其在 Cellar 中的真身畅涂。

axel
以下示例查找比 wget 下載速度高幾倍的支持斷點(diǎn)續(xù)傳多線程下載 CLI 命令行工具 axel,并顯示軟件包信息和依賴關(guān)系药有,然后安裝該工具:
faner@MBP-FAN:~|? brew search axelaxelfaner@MBP-FAN:~|? brew info axelaxel: stable 2.4 (bottled)Light UNIX download acceleratorhttps://packages.debian.org/sid/axelNot installedFrom: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/axel.rbfaner@MBP-FAN:~|? brew deps axelfaner@MBP-FAN:~|? faner@MBP-FAN:~|? brew install axel==> Downloading https://homebrew.bintray.com/bottles/axel-2.4.el_capitan.bottle.1.tar.gz############################################### 66.5%curl: (56) SSLRead() return error -9806Error: Failed to download resource "axel"Download failed: https://homebrew.bintray.com/bottles/axel-2.4.el_capitan.bottle.1.tar.gzWarning: Bottle installation failed: building from source.==> Downloading https://mirrors.ocf.berkeley.edu/debian/pool/main/a/axel/axel_2.4.orig.tar.gz######################################################################## 100.0%==> ./configure --prefix=/usr/local/Cellar/axel/2.4 --debug=0 --i18n=0==> make==> make install?? /usr/local/Cellar/axel/2.4: 8 files, 104K, built in 13 secondsfaner@MBP-FAN:~|? axel -VAxel version 2.4 (Darwin)Copyright 2001-2002 Wilmer van der Gaast.

從 homebrew 官方倉(cāng)庫(kù) homebrew.bintray.com
下載 axel 失敗后毅戈,自動(dòng)從鏡像源 mirrors.ocf.berkeley.edu
重新下載。下載的源碼緩存到目錄 /Library/Caches/Homebrew/axel-2.4.tar.gz
愤惰。
下載完成后苇经,依次執(zhí)行 ./configure
、make
和 make install
將軟件編譯安裝到 /usr/local/Cellar/axel/
目錄下宦言,根據(jù)版本存放到文件夾 2.4
下扇单。
將 usr/local/Cellar/axel/2.4/bin/axel
軟鏈到 /usr/local/bin/axel
,后者是前者的替身奠旺,執(zhí)行 axel 命令時(shí)蜘澜,真正調(diào)用的是其在 Cellar 中的真身。

subversion
search-info-deps-install
過(guò)程日志參考 brew install subversion.log响疚。
brew cask
Homebrew 作為 Ruby 社區(qū)極富想象力的作品鄙信,使得 Mac 下安裝 Mysql 等常用包不再困難。那么忿晕,是否也可以通過(guò) brew install mysql
這樣簡(jiǎn)單的方式來(lái)安裝 Google Chrome 瀏覽器呢装诡?為解決這一問(wèn)題,phinze 的作品 homebrew-cask 應(yīng)運(yùn)而生。
about
Homebrew 可以管理 Mac 下的命令行工具(wget鸦采、node)宾巍,brew cask 則是一套建立在 brew 上的增強(qiáng)命令行工具,支持管理 Mac 下的 GUI 程序渔伯,例如 qq顶霞、 google-chrome、evernote 等锣吼。cask 從鏡像源下載已經(jīng)編譯好了的應(yīng)用軟件二進(jìn)制包(.dmg/.pkg)到本地解壓到單獨(dú)的目錄(/opt/homebrew-cask/Caskroom
)下选浑,然后軟鏈(symlink)到 /Applications
目錄下。cask 包含了很多在 AppStore 里沒(méi)有的常用軟件吐限,省掉了手動(dòng)下載鲜侥、解壓、拖拽(安裝)等步驟诸典,且卸載也相當(dāng)容易與干凈,使用起來(lái)非常方便崎苗。
假設(shè)你已安裝好了 Homebrew狐粱,執(zhí)行以下命令查找 cask
包并顯示軟件包信息和依賴關(guān)系:
faner@MBP-FAN:~|? brew search caskcaskhomebrew/completions/brew-cask-completionfaner@MBP-FAN:~|? brew info caskcask: stable 0.7.3, HEADEmacs dependency managementhttps://cask.readthedocs.org/Not installedFrom: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/cask.rbfaner@MBP-FAN:~|? brew deps caskemacs

install
安裝 cask 極其簡(jiǎn)單,打開終端輸入:
brew tap phinze/homebrew-caskbrew install brew-cask

brew tap phinze/homebrew-cask
由于 brew 和包含的包源都是通過(guò) github 來(lái)管理胆数,人為的維護(hù)管理肌蜻。除了默認(rèn)的倉(cāng)庫(kù),還允許別人的源添加進(jìn)來(lái)必尼。通過(guò) brew tap
指定第三方包源:
$ brew tap

默認(rèn)的源是 caskroom/cask
蒋搜,以下顯式 tap 原作者的源(phinze/homebrew-cask
):
faner@MBP-FAN:~|? brew tap phinze/homebrew-cask==> Tapping phinze/caskCloning into '/usr/local/Library/Taps/phinze/homebrew-cask'...remote: Counting objects: 3278, done.remote: Compressing objects: 100% (3202/3202), done.remote: Total 3278 (delta 83), reused 731 (delta 59), pack-reused 0Receiving objects: 100% (3278/3278), 5.82 MiB | 428.00 KiB/s, done.Resolving deltas: 100% (83/83), done.Checking connectivity... done.Tapped 1 formula (3257 files, 24M)

brew install brew-cask
faner@MBP-FAN:~|? brew install brew-cask==> Installing brew-cask from phinze/homebrew-cask==> Cloning https://github.com/caskroom/homebrew-cask.gitCloning into '/Library/Caches/Homebrew/brew-cask--git'...remote: Counting objects: 3248, done.remote: Compressing objects: 100% (3172/3172), done.remote: Total 3248 (delta 82), reused 771 (delta 59), pack-reused 0Receiving objects: 100% (3248/3248), 5.82 MiB | 467.00 KiB/s, done.Resolving deltas: 100% (82/82), done.Checking connectivity... done.Note: checking out 'd39c95942f4226fb6c0e1a56c11008695ddeeade'.You are in 'detached HEAD' state. You can look around, make experimentalchanges and commit them, and you can discard any commits you make in thisstate without impacting any branches by performing another checkout.If you want to create a new branch to retain commits you create, you maydo so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name>==> Checking out tag v0.59.0?? /usr/local/Cellar/brew-cask/0.59.0: 2976 files, 12M, built in 32 seconds

本機(jī)已經(jīng)安裝了 brew-cask
的依賴軟件 **emacs
** :
faner@MBP-FAN:~|? whereis emacs/usr/bin/emacsfaner@MBP-FAN:~|? emacs --versionGNU Emacs 22.1.1Copyright (C) 2007 Free Software Foundation, Inc.GNU Emacs comes with ABSOLUTELY NO WARRANTY.You may redistribute copies of Emacsunder the terms of the GNU General Public License.For more information about these matters, see the file named COPYING.

如果沒(méi)有安裝 **emacs
*乎澄,則 brew 在安裝 cask 之前會(huì)自動(dòng)幫我們下載安裝 emacs

==> Installing dependencies for cask: emacs==> Installing cask dependency: emacs==> Downloading https://homebrew.bintray.com/bottles/emacs-24.5.yosemite.bottle.1.tar.gz######################################################################## 100.0%==> Pouring emacs-24.5.yosemite.bottle.1.tar.gz==> CaveatsTo have launchd start emacs at login: ln -sfv /usr/local/opt/emacs/
.plist ~/Library/LaunchAgentsThen to load emacs now: launchctl load ~/Library/LaunchAgents/homebrew.mxcl.emacs.plist==> Summary?? /usr/local/Cellar/emacs/24.5: 3915 files, 105M

brew cask
執(zhí)行 brew cask
或 brew-cask
可查看幫助概要(首次需輸入 sudo 密碼):
faner@MBP-FAN:~|? brew cask==> We need to make Caskroom for the first time at /opt/homebrew-cask/Caskroom==> We'll set permissions properly so we won't need sudo in the futurePassword:brew-cask provides a friendly homebrew-style CLI workflow for theadministration of Mac applications distributed as binaries.!! !! no command verb: !! Commands: audit verifies installability of Casks cat dump raw source of the given Cask to the standard output cleanup cleans up cached downloads and tracker symlinks create creates the given Cask and opens it in an editor doctor checks for configuration issues edit edits the given Cask fetch downloads Cask resources to local cache home opens the homepage of the given Cask info displays information about the given Cask install installs the given Cask list with no args, lists installed Casks; given installed Casks, lists staged files search searches all known Casks uninstall uninstalls the given Cask update a synonym for 'brew update' zap zaps all files associated with the given CaskSee also "man brew-cask"

執(zhí)行 brew-cask --version
命令可以查看安裝的 brew-cask 版本信息:
faner@MBP-FAN:~|? brew-cask --version0.59.0

command usage
brew cask 大部分命令和 brew 保持一致醋寝,新增了以下幾條命令:
命令
說(shuō)明

brew cask audit
查詢指定 Cask 的可安裝性

brew cask cat
查看指定 Cask 安裝源信息

brew cask zap
打包指定 Cask

brew cask cleanup
清理緩存及軟鏈

安裝了 cask 之后,就可以像 brew 一樣來(lái)搜索安裝軟件含蓉,以下示例 google-chrome :
搜索安裝包
faner@MBP-FAN:~|? brew-cask search google-chrome==> Exact matchgoogle-chrome

查詢安裝性
faner@MBP-FAN:~|? brew-cask audit google-chromeaudit for google-chrome: passed

查詢包信息
1.執(zhí)行 brew-cask cat
查詢指定 Cask 的源信息:
faner@MBP-FAN:~|? brew-cask cat google-chromecask :v1 => 'google-chrome' do version :latest sha256 :no_check url 'https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg' name 'Google Chrome' homepage 'https://www.google.com/chrome/' license :gratis tags :vendor => 'Google' app 'Google Chrome.app' zap :delete => [ '~/Library/Application Support/Google/Chrome', '~/Library/Caches/Google/Chrome', '~/Library/Caches/com.google.Chrome', '~/Library/Caches/com.google.Chrome.helper.EH', '~/Library/Caches/com.google.Keystone.Agent', '~/Library/Caches/com.google.SoftwareUpdate', '~/Library/Google/GoogleSoftwareUpdate', '~/Library/Logs/GoogleSoftwareUpdateAgent.log', ], :rmdir => [ '~/Library/Caches/Google', '~/Library/Google', ] caveats <<-EOS.undent The Mac App Store version of 1Password won't work with a Homebrew-Cask-linked Google Chrome. To bypass this limitation, you need to either: + Move Google Chrome to your /Applications directory (the app itself, not a symlink). + Install 1Password from outside the Mac App Store (licenses should transfer automatically, but you should contact AgileBits about it). EOSend

2.執(zhí)行 brew-cask info
查詢指定 Cask 的包信息:
faner@MBP-FAN:~|? brew-cask info google-chromegoogle-chrome: latestGoogle Chromehttps://www.google.com/chrome/Not installedhttps://github.com/phinze/homebrew-cask/blob/master/Casks/google-chrome.rb==> Contents Google Chrome.app (app)==> CaveatsThe Mac App Store version of 1Password won't work with a Homebrew-Cask-linked Google Chrome. To bypass this limitation, you need to either: + Move Google Chrome to your /Applications directory (the app itself, not a symlink). + Install 1Password from outside the Mac App Store (licenses should transfer automatically, but you should contact AgileBits about it).

安裝/卸載 應(yīng)用
brew-cask
安裝和卸載的命令同 brew
券盅,都是使用 install / uninstall
帮哈。
1.執(zhí)行 brew cask install google-chrome
命令安裝 google-chrome:
brew cask install google-chromefaner@MBP-FAN:~|? brew cask install google-chrome ==> CaveatsThe Mac App Store version of 1Password won't work with a Homebrew-Cask-linked Google Chrome. To bypass this limitation, you need to either: + Move Google Chrome to your /Applications directory (the app itself, not a symlink). + Install 1Password from outside the Mac App Store (licenses should transfer automatically, but you should contact AgileBits about it).==> Downloading https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg######################################################################## 100.0%==> Symlinking App 'Google Chrome.app' to '/Users/faner/Applications/Google Chrome.app'?? google-chrome staged at '/opt/homebrew-cask/Caskroom/google-chrome/latest' (216 files, 183M)

2.執(zhí)行 brew cask uninstall google-chrome
命令卸載 google-chrome:
faner@MBP-FAN:~|? brew-cask uninstall google-chrome==> Removing App symlink: '/Users/faner/Applications/Google Chrome.app'

uninstall
命令將刪除 /opt/homebrew-cask/Caskroom/google-chrome
及其在 ~/Applications/
下的軟鏈(symlink)。我們也可手動(dòng)刪除 homebrew 下載目錄中緩存的 google-chrome 安裝包 /Library/Caches/Homebrew/google-chrome-latest.dmg
及其軟鏈 /Library/Caches/Homebrew/Casks/google-chrome-latest.dmg
锰镀。
升級(jí)更新軟件
brew-cask 并沒(méi)有提供 brew 的 upgrade
命令娘侍,升級(jí)更新軟件只能通過(guò) DIY:
進(jìn)入應(yīng)用軟件的【關(guān)于】,手動(dòng)檢查是否可更新升級(jí)泳炉,使用軟件自己的更新流程憾筏。
卸載重裝 (brew cask uninstall
&& brew cask install
) ,實(shí)現(xiàn)間接升級(jí)花鹅。

brew-cask install 示例
文件預(yù)覽插件
有些插件可以讓 Mac 上的文件預(yù)覽更有效氧腰,比如語(yǔ)法高亮、markdown 渲染、json 預(yù)覽等等容贝。通過(guò) brew cask install
命令可以安裝這些插件:
$ brew cask install qlcolorcode$ brew cask install qlstephen$ brew cask install qlmarkdown$ brew cask install quicklook-json$ brew cask install qlprettypatch$ brew cask install quicklook-csv$ brew cask install betterzipql$ brew cask install webp-quicklook$ brew cask install suspicious-package

Visual Studio Code
~ $ brew cask search visual-studio-code==> Exact matchvisual-studio-code~ $ brew-cask cat visual-studio-codecask :v1 => 'visual-studio-code' do version '0.10.1' sha256 'b71089670b3c2a259bf26ad6a6ad7b0abc9bb805353e8087f5c86361a5f8defc' # vo.msecnd.net is the official download host per the vendor homepage url "https://az764295.vo.msecnd.net/public/#{version}-release/VSCode-darwin.zip" name 'Visual Studio Code' homepage 'https://code.visualstudio.com/' license :mit tags :vendor => 'Microsoft' app 'Visual Studio Code.app' zap :delete => [ '~/Library/Application Support/Code', '~/Library/Caches/Code', ]end~ $ brew-cask info visual-studio-codevisual-studio-code: 0.10.1Visual Studio Codehttps://code.visualstudio.com/Not installedhttps://github.com/caskroom/homebrew-cask/blob/master/Casks/visual-studio-code.rb==> Contents Visual Studio Code.app (app)~ $ brew-cask audit visual-studio-codeaudit for visual-studio-code: passed~ $ brew cask install visual-studio-code==> Downloading https://az764295.vo.msecnd.net/public/0.10.1-release/VSCode-darwin.zip######################################################################## 100.0%==> Symlinking App 'Visual Studio Code.app' to '/Users/thomasfan/Applications/Visual Studio Code.app'?? visual-studio-code staged at '/opt/homebrew-cask/Caskroom/visual-studio-code/0.10.1' (1675 files, 177M)

Wireshark
search-info-cat-audit-install
過(guò)程日志參考 brew-cask install wireshark.log自脯。
參考
Mac 利器:brew、brew cask斤富、zshMac安裝軟件新方法:Homebrew-cask簡(jiǎn)潔優(yōu)雅的Mac OS X軟件安裝體驗(yàn) - homebrew-cask使用brew cask來(lái)安裝Mac應(yīng)用Mac下通過(guò) brew 安裝不同版本的 PHP
Launchrocket 幫助管理 Homebrew 安裝的服務(wù)homebrew cask 安裝 launchrocket

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膏潮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子满力,更是在濱河造成了極大的恐慌焕参,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油额,死亡現(xiàn)場(chǎng)離奇詭異叠纷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)潦嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門涩嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人掂僵,你說(shuō)我怎么就攤上這事航厚。” “怎么了锰蓬?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵幔睬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我芹扭,道長(zhǎng)麻顶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任舱卡,我火速辦了婚禮辅肾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灼狰。我一直安慰自己宛瞄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布交胚。 她就那樣靜靜地躺著份汗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝴簇。 梳的紋絲不亂的頭發(fā)上杯活,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音熬词,去河邊找鬼旁钧。 笑死吸重,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歪今。 我是一名探鬼主播嚎幸,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寄猩!你這毒婦竟也來(lái)了嫉晶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤田篇,失蹤者是張志新(化名)和其女友劉穎替废,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泊柬,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椎镣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兽赁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片状答。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刀崖,靈堂內(nèi)的尸體忽然破棺而出剪况,到底是詐尸還是另有隱情,我是刑警寧澤蒲跨,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站授翻,受9級(jí)特大地震影響或悲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堪唐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一巡语、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淮菠,春花似錦男公、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拥知,卻和暖如春踏拜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背低剔。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工速梗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肮塞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓姻锁,卻偏偏與公主長(zhǎng)得像枕赵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子位隶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容