基于 Swift 創(chuàng)建 CocoaPods 完全指南

作者:AppCoda,原文鏈接核行,原文日期:2016-09-16
譯者:ckitakishi;校對:mmoaay;定稿:CMB

CocoaPods 是一個面向 Xcode 的項目依賴管理工具线欲。當(dāng)需要向項目添加庫和框架時,它是一項極其有用且值得選擇的服務(wù)李丰。

試想一下,有人開發(fā)了一個足以改變游戲規(guī)則竖慧、且具有劃時代意義的庫,并想把它分享給這個世界。這時候該怎么辦钳垮?長話短說悄泥,我要說的是你需要知道如何發(fā)布自己的 CocoaPod!

前提

本教程基于 Xcode 8 和 Swift 3瞧剖。如果你想了解更多關(guān)于 Swift 3 的新特性,可以閱讀這篇很棒的教程

譯者注:本站譯作

目前莺治,CocoaPods 有一個針對 Swift 3 和 Xcode 8 的預(yù)發(fā)布版本。為了編譯基于 Swift 3 的項目帚稠,你應(yīng)該使用這個版本谣旁。在終端執(zhí)行下述命令即可完成安裝:

sudo gem install cocoapods --pre

同時你還需要一點 CocoaPods 的使用經(jīng)驗。不妨看看這篇 Gregg Mojica 寫的令人驚嘆的教程滋早,我相信你會從中了解更多相關(guān)的內(nèi)容榄审。

好了,我們開始杆麸!

做一個值得用 Pod 管理的項目

從現(xiàn)在開始搁进,讓我們來做一個具有創(chuàng)造性,值得用 pod 管理的項目昔头。我的想法是做一個會緩慢改變顏色的 UIView饼问。我相信對于背景來說這會十分有用。

讓我們先從最基礎(chǔ)的地方開始揭斧。首先莱革,在 Xcode 中創(chuàng)建一個新工程,選擇使用 single view 模版讹开。將工程命名為 FantasticView盅视。項目創(chuàng)建之后,添加一個同名的 Swift 文件 FantasticView.swift萧吠。

現(xiàn)在你已經(jīng)有了 FantasticView.swift左冬,然后在其中定義一個名為 FantasticView 的類,它繼承自 UIView

import UIKit
 
class FantasticView : UIView {
 
}

初始化

下一步纸型,為上面定義的類添加兩個初始化方法:

override init(frame: CGRect) {
    super.init(frame: frame)
        
    // 核心部分 
}
    
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
 
    // 你不需要實現(xiàn)這部分
}

第一個初始化方法是 init(frame: CGRect) 拇砰。當(dāng)一個 frame 被傳給 FantasticView 的構(gòu)造函數(shù)時該方法會被調(diào)用。我們將會在這里調(diào)用顏色更改函數(shù)狰腌。

酷炫的顏色

接下來除破,定義一個由 UIColor 對象組成的數(shù)組 colors。在我們的核心代碼中琼腔,將會通過“遍歷”這個數(shù)組來改變 UIView 的背景顏色瑰枫。

let colors : [UIColor] = [.red, .orange, .yellow, .green, .blue, .purple]

除此之外,你還需要添加一個計數(shù)器對象,在每次顏色改變時計數(shù)光坝。

var colorCounter = 0

但是為什么需要一個計數(shù)器呢尸诽?難道我們不是在遍歷顏色數(shù)組嗎?

注意我剛剛是怎么說“遍歷”的

魔法調(diào)味劑

現(xiàn)在我要告訴你如何處理遍歷顏色數(shù)組的問題盯另。

你可能會認(rèn)為在 UIView 的動畫 block 中設(shè)置一系列顏色也是一種方法性含。然而遺憾的是,這無法正常工作鸳惯,因為最終將只有一種顏色生效商蕴。

還有一種方法是創(chuàng)建一個 for 循環(huán),然后在其中運行一個動畫 block芝发。這也將遇到先前的問題绪商。要解決這個問題,你可以使用 GCD 來等待動畫 block 執(zhí)行完畢辅鲸。

但是我堅信有更簡單的方法格郁。沒錯,你可以使用 NSTimer瓢湃!

在你的 init(frame: CGRect) 方法中添加下述代碼:

let scheduledColorChanged = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { (timer) in  //1
    UIView.animate(withDuration: 2.0) {  //2
        self.layer.backgroundColor = self.colors[self.colorCounter % 6].cgColor  //3
        self.colorCounter+=1  //4
    }
}
        
scheduledColorChanged.fire()  //5

讓我們逐行看一看上面的代碼:

  1. 創(chuàng)建一個 Timer 對象理张,也就是剛才說的的 NSTimer。為定時器設(shè)置一個時間間隔绵患,讓它重復(fù)執(zhí)行某些動作。在設(shè)置時間間隔之后悟耘,我們的定時器將會運行一個代碼塊落蝙。

  2. 調(diào)用 animate(withDuration) 函數(shù)。

  3. 設(shè)置 UIView.layer.backgroundColor暂幼。注意筏勒,并不是 UIView.backgroundColor,因為 layer 屬性可動旺嬉,而 UIView 屬性不可管行。

  4. 計數(shù)器加 1。

  5. 銷毀計時器邪媳。

讓我們看看第三步中我具體做了什么捐顷。通過下標(biāo)可以從 colors 中取得一個 UIColorcolorCounter 應(yīng)該是一個介于 0 到 5 之間的數(shù)字雨效,因為這是 colors 數(shù)組的界限迅涮。我使用 %mod 操作符來求得 colorCounter 除以 6 的余數(shù)。所以如果 colorCounter 是 10徽龟,則求余得 4叮姑,于是此時選擇 colors 數(shù)組的第四項。

使用 Fantastic View

是時候在我們的主 View Controller 中使用 Fantastic View 了据悔。我希望我的 View Controller 擁有一個酷炫的背景传透,所以讓我們在 ViewController.swiftviewDidLoad 方法中插入下列代碼:

let fantasticView = FantasticView(frame: self.view.bounds)
        
self.view.addSubview(fantasticView)

這里我們定義了一個 FantasticView耘沼,并使其邊框等于 ViewController 的視圖邊界。然后將 fantasticView 作為子視圖添加到主 view朱盐。

好了耕拷,在模擬器中運行應(yīng)用吧托享!你將會看到隨著時間推移骚烧,背景也隨之改變。

推送到 GitHub

我知道你一定會問:“為什么不將 fantastic view 公布于眾呢闰围?人們有必要知道它赃绊!”

對,沒錯羡榴。讓我們來創(chuàng)建一個 Pod碧查,然后人們就可以使用它了!但是在此之前校仑,需要先將其推送到 GitHub忠售。

CocoaPods 要求 Pod 有一個源。大多數(shù)情況下迄沫,開發(fā)者使用 GitHub 來完成這一切稻扬。我們來快速過一遍提交項目到 GitHub 的必要步驟。如果你想知道更多 Git 的基礎(chǔ)知識羊瘩,不妨看一看這篇優(yōu)秀的教程泰佳。

簡單來說,下面這些就是你需要做的:

  1. 在 Github 上創(chuàng)建一個名為 FantasticView 的倉庫尘吗。

  2. 復(fù)制倉庫的 URL逝她。

  3. 打開終端,跳轉(zhuǎn)到你的工程目錄下睬捶。

  4. 初始化 Git:git init

  5. 將所有已修改文件添加到 Git 暫存區(qū)中:git add .

  6. 提交這些已修改文件:git commit -m "init"

  7. 添加一個遠(yuǎn)程庫 :git remote add origin <paste your URL here>

  8. 推送到遠(yuǎn)程分支:git push -u origin master

現(xiàn)在你必須為你的倉庫創(chuàng)建一個 release黔宛。一個 release 對應(yīng)產(chǎn)品的一個新版本。你可以在 Github 的操作面板上嘗試創(chuàng)建擒贸。首先進(jìn)入你的倉庫臀晃。

  1. 點擊 releases 按鈕。
  1. 點擊 Create a new release
  1. 將版本號設(shè)置為 0.1.0酗宋,然后輸入標(biāo)題和描述积仗。
  1. 點擊 Publish release,然后你看所看到的應(yīng)該與下圖相似:

以上是關(guān)于 Github 的內(nèi)容蜕猫,讓我們開始創(chuàng)建 Pod 本身吧寂曹!

創(chuàng)建 Pod

首先,我們需要確保已經(jīng)安裝 CocoaPods,并做好在終端使用它的準(zhǔn)備隆圆。動手吧漱挚,打開終端,運行以下命令:

sudo gem install cocoapods --pre

現(xiàn)在 CocoaPods 已經(jīng)安裝完成渺氧,下一步輪到創(chuàng)建 Pod 了旨涝。

創(chuàng)建 Podspec

所有 Pods 都擁有一個 podspec 文件。podspec侣背,顧名思義白华,用于定義 Pod 規(guī)范!讓我們動手創(chuàng)建一個:

  1. 打開終端贩耐,進(jìn)入項目根目錄弧腥。

  2. 運行 touch FantasticView.podspec 命令以創(chuàng)建文件。

  3. 使用編輯器打開文件潮太。

  4. 將以下代碼粘貼到 Podspec 文件中:

    pod
    Pod::Spec.new do |s|
    s.name = 'FantasticView'
    s.version = '0.1.0'
    s.summary = 'By far the most fantastic view I have seen in my entire life. No joke.'

    s.description = <<-DESC
    This fantastic view changes its color gradually makes your app look fantastic!
    DESC

    s.homepage = 'https://github.com/<YOUR GITHUB USERNAME>/FantasticView'
    s.license = { :type => 'MIT', :file => 'LICENSE' }
    s.author = { '<YOUR NAME HERE>' => '<YOUR EMAIL HERE>' }
    s.source = { :git => 'https://github.com/<YOUR GITHUB USERNAME>/FantasticView.git', :tag => s.version.to_s }

    s.ios.deployment_target = '10.0'
    s.source_files = 'FantasticView/FantasticView.swift'

    end

s 后面的這些變量都是 CocoaPods 需要的管搪,提供像是名字,版本铡买,概要更鲁,描述,倉庫奇钞,源代碼文件等必要信息澡为。

下面介紹幾個需要注意的重要變量:

  1. s.name – 顯而易見,他人使用時可以通過該名字將 Pod 添加到項目中蛇券。

  2. s.version – 這是你 Pod 的版本缀壤。務(wù)必注意,它得和 Github release 的版本號相同纠亚。如果兩者不匹配,就會報錯筋夏。

  3. s.summarys.description – 這兩個變量最終會顯示在 Cocoapods 頁面上蒂胞。請確保 descriptionsummary 更長,否則將會報錯条篷。

  4. s.homepage – 這是 Pod 源代碼的 URL骗随。注意將 YOUR GITHUB USERNAME 替換為你的用戶名喲。

  5. s.author – 開發(fā)者信息赴叹,注意替換相應(yīng)內(nèi)容鸿染。

  6. s.source_files – 這是最重要的參數(shù)。它會告訴 CocoaPods 應(yīng)該克隆哪些文件乞巧。我想要我的 FantasticView.swift 被克隆涨椒,它的目錄是 FantasticView/FantasticView.swift。另外,有很多方法可以添加多個文件作為源代碼文件蚕冬。讓我們來看一個例子:

    ├── FantasticView.xcodeproj
    └── FantasticView
    ├── ViewController.swift
    ├── Info.plist
    ├── FantasticView.swift
    └── FantasticerView.swift

在這個例子中免猾,我希望包含所有 .swift 文件。為達(dá)到目的囤热,我會將 source_files 變量設(shè)置為洗面這樣:

'FantasticView/*.swift'

星號 * 表示包含任意文件猎提。當(dāng)星號位于文件類型前時,表明包括所有該類型的文件旁蔼。

假設(shè)你想要在 Pod 下載時包含所有位于 /FantasticView 下的文件锨苏,只需要將文件名字和類型用星號代替即可:

'FantasticView/*'

這樣就涵蓋了所有,甚至是其他目錄棺聊。為了限制文件類型伞租,你也可以使用如下語句:

'FantasticView/*.{swift,plist}'

在這個例子中,將會涵蓋所有的 swiftplist 文件躺屁。

用 Lint 驗證項目

CocoaPods 需要驗證項目有沒有錯誤肯夏,這包含對錯誤甚至可疑代碼的限制和要求。也就是說在發(fā)布項目之前 CocoaPods 要求你 lint 你的項目犀暑。

lint 一個項目十分簡單驯击,但是絕對是難以置信的麻煩!為了 lint 你的項目耐亏,請在項目目錄下執(zhí)行以下命令:

pod lib lint

可能會得到下述警告:

-> FantasticView (0.1.0)
    - WARN  | description: The description is shorter than the summary.
    - WARN  | url: There was a problem validating the URL https://github.com/<YOUR GITHUB USERNAME>/FantasticView.

警告說的很直接徊都。在這個例子中,你應(yīng)該增加描述內(nèi)容的長度广辰,并提交一個合法的源代碼 URL暇矫。一旦發(fā)生錯誤,甚至僅僅只是只是一個警告择吊,CocoaPods 的 lint 就會失敗李根。

再來讓我們看看你可能會遭遇的錯誤:

-> FantasticView (0.1.0)
    - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use --verbose for more information.
    - ERROR | [iOS] xcodebuild:  /Users/sahandedrisian/Desktop/FantasticView/FantasticView/FantasticView.swift:13:32: error: type 'UIColor' has no member 'red'
    - ERROR | [iOS] xcodebuild:  /Users/sahandedrisian/Desktop/FantasticView/FantasticView/FantasticView.swift:20:37: error: use of unresolved identifier 'Timer'

當(dāng)真的遇到錯誤的時候,不要著急几睛,嘗試通讀錯誤提示并分析為什么發(fā)生這個錯誤房轿。在本例中,你會注意到下述信息:

type UIColor has no member red.

但是為什么不能識別 UIColor所森,事實上存在一個名為 red 的成員呀囱持?

一個合理的猜想是,在 Swift 3.0 中 UIColor.redColor() 已經(jīng)變?yōu)榱?UIColor.red焕济。由此可以推測 CocoaPods纷妆,或者具體說是 xcodebuild 編譯項目使用的是 swift 2.2 或 2.3。第二個錯誤也驗證了我們的猜想晴弃,因為 NSTimer 已經(jīng)轉(zhuǎn)換為了 Timer掩幢。

那么究竟可以如何修復(fù)這個問題呢逊拍?CocoaPods 為此發(fā)布了一個修正版。在 lint 時你被要求必須指定 Swift 版本粒蜈。為了這么做顺献,你必須得創(chuàng)建一個名為 .swift-version 的新文件,并添加編譯器版本枯怖。只需簡單地輸出以下命令:

echo "3.0" >> .swift-version

現(xiàn)在再次運行 pod lib lint注整,你應(yīng)該能夠得到一條通過驗證的消息:

-> FantasticView (0.1.0)
 
FantasticView passed validation.

Woohoo!你通過了整個流程中最富挑戰(zhàn)的一部分度硝。

注意:如果出現(xiàn)含義不明的錯誤或警告消息肿轨,請嘗試鍵入此命令,pod lib lint -verbose蕊程,相比常規(guī)的 pod lint 命令椒袍,你將得到更詳細(xì)的信息。

發(fā)布你的 Pod

噢藻茂,是時候?qū)⒛愕?Fantastic View 發(fā)布到 CocoaPods 了驹暑。每個開發(fā)者都應(yīng)該擁有一個 CocoaPods 賬戶,以備發(fā)布之時用辨赐。

現(xiàn)在的你應(yīng)該會覺得优俘,CocoaPods 賬號就是一個 CocoaPods 賬號啊,然而并不是掀序,它是一個 Trunk 賬號帆焕。我并不是在評判 CocoaPods,但我覺得這是一個十分奇怪的決定不恭,著實讓我困惑了一段時間叶雹。我這么說了之后,你會不會想讀一下他們所寫的關(guān)于為什么做 Trunk 的博文换吧。

創(chuàng)建 Trunk 賬號

確切地說折晦,Trunk 并不是一個賬號;是一個會話沾瓦。所以從根本上來說并不需要密碼的存在筋遭,需要的僅僅是一個郵箱。

創(chuàng)建流程非常簡單:

pod trunk register <Your Email>

你應(yīng)該很快就會受到一封來自 CocoaPods 的郵件以驗證你發(fā)起的“會話”暴拄。點擊郵件提供的鏈接,完成你的賬號驗證编饺。之后 CocoaPods 將會給你發(fā)來友好的歡迎信息:好棒乖篷,設(shè)置完成!

推送你的 Pod

到這一步透且,就只剩下用 Trunk 將你的 podspec 推送到 CocoaPods 了:

pod trunk push FantasticView.podspec

由于我已經(jīng)搶先一步使用了 FantasticView 這個超級酷炫的名字撕蔼,它就不再可用了豁鲤。你應(yīng)該在 podspec 文件中修改 s.name,同時不要忘記修改你的 podspec 文件的名字鲸沮。

完成修改之后琳骡,像前一節(jié)所演示的一樣 lint 你的 podspec,然后再一次推送你的 trunk讼溺。若成功推送了你的 Pod楣号,應(yīng)該會得到以下信息:

Updating spec repo `master`
Validating podspec
 -> FantasticView (0.1.0)
 
Updating spec repo `master`
  - Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/06dcdf13dd11b8c2eb4fd522b25a652fa654b180/Specs/FantasticView/0.1.0/FantasticView.podspec.json
  - Log messages:
    - September 24th, 11:08: Push for 'FantasticView 0.1.0' initiated.
    - September 24th, 11:08: Push for 'FantasticView 0.1.0' has been pushed (0.500379641 s).

恭喜!回顧所做的一切怒坯,并非那么難炫狱,對吧?現(xiàn)在可以將 Pod ‘FantasticView’ 添加到你的 podfile 了剔猿。

總結(jié)

事實上视译,有幾種不同的方式來推送你的 Pod。你也可以使用 CocoaPods 模版來創(chuàng)建 Pod 工程归敬,其中包含示例項目酷含,readme,license 等等汪茧。不過我認(rèn)為這稍有些復(fù)雜了椅亚,因為它包含了一些不必要的步驟,繁瑣陆爽,還容易讓人困惑什往。

在本教程中,我創(chuàng)建了一個工程慌闭,添加了一個 podspec别威,解釋了 podspec 文件的不同選項,創(chuàng)建了一個 trunk 賬號并推送了 Pod驴剔。如果遇到了問題省古,你可以在 CocoaPods 的 Github 倉庫提交一個 issue。那是一個非常友好的社區(qū)丧失,很酷豺妓,他們總是會在最短時間內(nèi)給出答復(fù)。

誠摯地希望你喜歡這篇教程布讹!你可以在這里下載完整項目作為參考琳拭。

本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán)描验,最新文章請訪問 http://swift.gg白嘁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膘流,隨后出現(xiàn)的幾起案子絮缅,更是在濱河造成了極大的恐慌鲁沥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耕魄,死亡現(xiàn)場離奇詭異画恰,居然都是意外死亡,警方通過查閱死者的電腦和手機吸奴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門允扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奄抽,你說我怎么就攤上這事蔼两。” “怎么了逞度?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵额划,是天一觀的道長。 經(jīng)常有香客問我档泽,道長俊戳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任馆匿,我火速辦了婚禮抑胎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渐北。我一直安慰自己阿逃,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布赃蛛。 她就那樣靜靜地躺著恃锉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呕臂。 梳的紋絲不亂的頭發(fā)上破托,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音歧蒋,去河邊找鬼土砂。 笑死,一個胖子當(dāng)著我的面吹牛谜洽,可吹牛的內(nèi)容都是我干的萝映。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阐虚,長吁一口氣:“原來是場噩夢啊……” “哼锌俱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敌呈,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贸宏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磕洪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吭练,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年析显,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲫咽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡谷异,死狀恐怖分尸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歹嘹,我是刑警寧澤箩绍,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站尺上,受9級特大地震影響材蛛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怎抛,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一卑吭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧马绝,春花似錦豆赏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唉窃,卻和暖如春耙饰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纹份。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工苟跪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔓涧。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓件已,卻偏偏與公主長得像,于是被迫代替她去往敵國和親元暴。 傳聞我的和親對象是個殘疾皇子篷扩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 項目組件化、平臺化是技術(shù)公司的共同目標(biāo)茉盏,越來越多的技術(shù)公司推崇使用pod管理第三方庫以及私有組件鉴未,一方面使項目架構(gòu)...
    swu_luo閱讀 21,750評論 0 39
  • 一枢冤、創(chuàng)建的github倉庫原文地址 1 進(jìn)入Github網(wǎng)站www.github.com登陸自己的賬號后 2 建立...
    freesan44閱讀 3,932評論 2 12
  • Cocoapods是非常好用的一個iOS依賴管理工具,使用它可以方便的管理和更新項目中所使用到的第三方庫铜秆,以及將自...
    Nash33閱讀 2,084評論 0 50
  • Ruby 安裝 要安裝cocospods 首先需要安裝ruby淹真,可以先安裝xcode,再安裝macport 连茧,最后...
    山天大畜閱讀 1,856評論 0 1
  • 可能核蘸,這是我第一次休這么長的假期,多少年了啸驯,每次假期都怕臨時有事客扎,其實呢?然并卵罚斗!自己嚇自己徙鱼!這一路走來,來來回回...
    VVSAMA閱讀 381評論 0 0