์๋ ํ์ธ์ Foma ๐์ ๋๋ค!
ํ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ธ์ ๊ฐ ๋๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ์จ๋ด์ผ์งํ๋๋ฐ
๋๋์ด ๊ทธ๋ฐ ๋ ์ด ์ค๋ค์...
๊ทธ๋์ ์ค๋์ ์๊ธฐ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํด๋ณด๋ ๊ฒ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
๋ฐ๋ก ์์ํ ๊ฒ์~
Terminal
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ๊ฒฝ๋ก๋ก ์ด๋ํ์ ๋ค ์๋์ ๊ฐ์ด ์ ๋ ฅํ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์!
pod lib create ์ํ๋์ด๋ฆ
์ด๋ ๊ฒ ํ๋ฉด ์ด 5๊ฐ์ง ์ง๋ฌธ์ด ๋์ฌ๊ฑฐ์์.
1. ์ด๋ค ํ๋ซํผ์ ์ฌ์ฉํ๊ฑฐ๋? iOS /macOS -> iOS
2. ์ด๋ค ์ธ์ด๋ฅผ ์ฌ์ฉํ ๊ฑฐ๋? Swift/Objc -> Swift
3. ๋ ๋ฐ๋ชจ์ฑ ํฌํจํ ๊ฑฐ์ผ? -> Yes
4. ํ ์คํธ๋ ๋ญ๋ก ํ ๊ฑฐ์ผ? Quick/None -> None
5. ๋ทฐ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธ ํ ๊ฑฐ์ผ? No
์ด๋ ๊ฒ ์ ๋ ฅํ์๋ฉด ์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ pod์ ์ค์นํ๊ณ Xcode ํ๋ก์ ํธ๊ฐ ์๋์ผ๋ก ์คํ๋ ๊ฑฐ์์!
Xcode
Development Pods -> ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฆ -> ReplaceMe.Swift๋ก ์ด๋ํด์ฃผ์ธ์!
ReplaceMe.Swift ํ์ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ช .swift๋ก ํด์ฃผ์ธ์!
๊ทธ๋ฆฌ๊ณค ๊ฐ๋จํ๊ฒ ์ด๋ฆ๊ณผ ํจ๊ป ์ธ์ฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊ฒ์!
์ธ๋ถ์์ ์ฌ์ฉํด์ผ ํ๋ ๋ฐ๋์ open์ด๋ public์ผ๋ก ์์ฑํ์ ์ผ ํฉ๋๋ค!
import Foundation
public struct Foma {
public static func sayHello(with name:String) {
print("\(name)๋ ์๋
ํ์ธ์.")
}
}
Example ์ฑ์ผ๋ก ์ด๋ํด์ ํ ์คํธ ํด๋ณผ๊น์? (์ฒ์์ 5๊ฐ์ง ์ง๋ฌธ์์ ๋ฐ๋ชจ์ฑ ๋ง๋ค๊ฑฐ์ผ?๊ฐ ๋ฐ๋ก ์ด๊ฒ์ ๋๋ค.)
๋ทฐ์ปจํธ๋กค๋ฌ๋ก ์ด๋ํด์ ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ importํ๊ณ ์์ฑํ ์ฝ๋๋ฅผ ์คํํด๋ด ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ์ด ๋จ๋ฉด์ ์คํ๋ ๊ฑฐ์์.
์ด๋ ๊ฒ ์ด๋ฆ๊ณผ ํจ๊ป ์ ์ถ๋ ฅ์ด ๋์์ต๋๋ค.
๊ทธ ๋ค์์ผ๋ก Podspec ํ์ผ๋ก ์ด๋ํด์ฃผ์ธ์!
ํ์คํ์ ์๋์ ๊ฐ์ด ํ์์ ๋ง๊ฒ ์์ฑํด์ฃผ์ธ์!
(ํนํ s.source_files ๊ฒฝ๋ก๋ฅผ ์ ์์ฑํด์ฃผ์ธ์ ใ ์ด๊ฒ ๋๋ฌธ์ ๋ช ์๊ฐ์ ๊ณ ์ํ๋ฏ...ใ )
Pod::Spec.new do |s|
//์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ
s.name = 'FomaPrint'
//๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์
s.version = '0.1.0'
//๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฝ๋ด์ฉ
s.summary = '์ด๊ฒ์ ์ธ์ฌ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค!'
//๊นํ๋ธ ์ฃผ์
s.homepage = 'https://github.com/fomagran/FomaPrint'
//MIT ๋ผ์ด์ผ์ค
s.license = { :type => 'MIT', :file => 'LICENSE' }
//๋ง๋ ์ฌ๋ ์ด๋ฆ๊ณผ ์ฃผ์
s.author = { 'fomagran' => 'fomagran6@naver.com' }
//๊น ์์ค
s.source = { :git => 'https://github.com/fomagran/FomaPrint.git', :tag => s.version.to_s }
//์ต์ ๋ฐฐํฌ ํ๊ฒ
s.ios.deployment_target = '9.0'
//์์คํ์ผ ๊ฒฝ๋ก
s.source_files = 'FomaPrint/Classes/**/*'
//ํ์ฌ swift ๋ฒ์
s.swift_versions = '5.0'
end
๊ทธ๋ฆฌ๊ณค git์ ๊ด๋ฆฌํ๋ ํญ์ผ๋ก ์ด๋ํด์ ์๋ก์ด ์๊ฒฉ ์ ์ฅ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๋ ํฌ์งํ ๋ฆฌ ์ด๋ฆ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋๊ฐ์ด ํด์ฃผ์๊ณ Create๋ฅผ ๋๋ฌ์ฃผ์ธ์!
์ด์ ๊นํ๋ธ๋ก ๊ฐ์ ํ์ธํด๋ณด๋ฉด ์๋ก์ด ๋ ํฌ์งํ ๋ฆฌ๊ฐ ๋ง๋ค์ด์ ธ ์์๊ฑฐ์์!
(์ด๊ฑฐ ๋ณด๊ณ ์ง์ง ๋ฟ๋ฏํ๋๋ฐ...)
Terminal
์ด์ ๋ค์ ํฐ๋ฏธ๋๋ก ์ด๋ํด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฐฐํฌ๋ฅผ ํด๋ณผ๊น์?
์๋์ ๊ฐ์ด ์ ๋ ฅํด .podspec ํ์ผ์ ์๋ฌด๋ฐ ์ด์์ด ์๋์ง ์ฒดํฌํฉ๋๋ค.
pod spec lint
์ด๋ ๊ฒ ์คํํ๋ฉด ๊ฒฝ๊ณ ์ ์ค๋ฅ๊ฐ ๋จ๋๋ฐ์.
๋จผ์ ๊ฒฝ๊ณ ๋ ์์ฝํ ๋ด์ฉ์ด ๋ณ๋ก ์๋ฏธ์์ง ์๋ค๋ผ๋ ๋ด์ฉ์ด๊ตฌ์.
(summary๋ฅผ ๊ณ ์น๊ธฐ ์ ์ ๋ฌ ๊ฒฝ๊ณ ์์. ์์์ ์์ฝ์ ์ ๋๋ก ์ฐ์ จ์ผ๋ฉด ์๋จ์ค๊ฑฐ์์,)
์๋ฌ๋ ์๊ฒฉ ์ ์ฅ์์ 0.1.0 ๋ฒ์ ํ๊ทธ๊ฐ ์๋ค๋ ๊ฑฐ์์.
Xcode๋ก ์ด๋ํด์ ์์ชฝ ํญ์ Source Control์์ Commit์ ๋๋ฌ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณค ๋ฐ๋ ๋ด์ฉ์ Commitํ๊ณ origin/master์ Push to remote๋ฅผ ์ปค๋ฐ์ ํธ์ฌํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณค ๊นํ๋ธ๋ก ๊ฐ์ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ปค๋ฐํ ๋ด์ฉ์ผ๋ก ์ ๋ฐ์ดํธ ๋์ด์์๊ฑฐ์์!
๊ทธ ๋ค์ ํฐ๋ฏธ๋๋ก ์ด๋ํด์ ์๋์ ๊ฐ์ด ์ ๋ ฅํด์ค๋๋ค.
git tag ๋ฒ์
git push origin ๋ฒ์
์ด๋ ๊ฒ ํด์ฃผ์๊ณ ๋ง์ฝ ์๋ฌ๋ ๊ฒฝ๊ณ ๊ฐ ํ๋๋ ์๋ค๋ฉด passed validation์ด ๋ฐ๊ฑฐ์์!
(๋ง์ฝ ๊ฒฝ๊ณ ๋ฅผ ๊ทธ๋ฅ ๋ฌด์ํ๊ณ ์ถ๋ค๋ฉด pod spec lint --allow-warnings๋ก ํ์๋ฉด ๋ฉ๋๋ค.)
๊ทธ ๋ค์ pod์ ๋ฑ๋ก์ ํด์ฃผ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์ด๋ฉ์ผ ์ฃผ์์ ์ด๋ฆ์ ์์ฑํด์ค๋๋ค.
pod trunk register ์ด๋ฉ์ผ์ฃผ์ ์ด๋ฆ
์ด๋ฉ์ผ ์ฃผ์๋ก ๊ฐ์ ์์ ์ด ๋ง๋์ง ์ฒดํฌํด๋ฌ๋ผ๊ณ ํ ๊ฑฐ์์.
์ด๋ฉ์ผ๋ก ์ด๋ํ์ ์ ๋งํฌ๋ฅผ ํด๋ฆญํ์๋ฉด
์ฝ์ฝ์ํ ์ฌ์ดํธ๋ก ์ด๋๋๋ฉด ์ ์ ์ด ์๋ฃ๋์๋ค๊ณ ๋ฐ๊ฑฐ์์.
๋ค์ ํฐ๋ฏธ๋๋ก ์ด๋ํด์ ์๋์ ๊ฐ์ด ์ ๋ ฅํด์ฃผ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ์ฝ์ํ์ ํธ์ฌํด์ค๋๋ค.
pod trunk push ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฆ.podspec
์ด๋ ๊ฒ ํ๋ฉด ์๋์ ๊ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์ถ์๋์๋ค๊ณ ๋ฐ๊ฑฐ์์!
๊นํ๋ธ๋ก ์ด๋ํด์ ํ์ธํด๋ณด๋ฉด ๋ฒ์ ๊ณผ ํ๋ซํผ ๋ผ์ด์ผ์ค๊ฐ ์๋์ ๊ฐ์ด ์ ๋๋ก ์ถ์๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!
Update
์ด๋ ๊ฒ ์ถ์ํ๊ณ ์ํ๋ ์ฝ๋๋ก ์ถ๊ฐํด์ฃผ๋ ค๋ฉด ์ ๋ฐ์ดํธ๋ฅผ ํด์ค์ผ๊ฒ ์ฃ ?
๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ๋ก ์ด๋ํด์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
import Foundation
public struct Foma {
public static func sayHello(with name:String) {
print("\(name)๋ ์๋
ํ์ธ์.")
}
public static func sayBye(with name:String) {
print("\(name)๋ ์๋
ํ ๊ฐ์ธ์.")
}
}
๊ทธ ๋ค์ ํ์คํ ํ์ผ๋ก ์ด๋ํด์ ์ํ๋ ๋ฒ์ ์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค.
s.version = '0.1.1'
๋ฐ๋ ๋ด์ฉ์ ์ปค๋ฐ ํ ํธ์ฌํด์ฃผ์ธ์.
๊ทธ ๋ค์ ํฐ๋ฏธ๋๋ก ์ด๋ํด์ git์ ๋ฐ๋ tag๋ฅผ ๋ฌ์์ค๋๋ค.
git tag 0.1.1
git push origin 0.1.1
๊ทธ ๋ค์ pod trunk์ ํธ์ฌ๋ฅผ ํด์ค๋๋ค.
pod trunk push
์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด ๋ฒ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ถ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Test
์ด์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ณผ ํ๋ก์ ํธ๋ก ์ด๋ํด์ค๋๋ค.
Podfile์ ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
pod '๋ผ์ด๋ธ๋ฌ๋ฆฌ'
ํน์๋ผ๋ ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ด๋ค๋ฉด ์๋์ ๊ฐ์ด ์ถ๊ฐํด์ฃผ์ธ์!
pod '๋ผ์ด๋ธ๋ฌ๋ฆฌ', :git => '๊น ์ฃผ์', :tag => '์๋ก์ด ๋ฒ์ '
์ด๋ ๊ฒ ํ๋ฉด ์๋์ ๊ฐ์ด ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์น๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ทฐ์ปจํธ๋กค๋ฌ๋ก ์ด๋ํด์ ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ํด์ฃผ์๊ณ ์๋์ ๊ฐ์ด ๋ฉ์๋๋ค์ ์คํ์ํค๋ฉด
import UIKit
import FomaPrint
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Foma.sayHello(with: "Fomagran")
Foma.sayBye(with: "Fomagran")
}
}
์๋์ ๊ฐ์ด ์ถ๋ ฅ์ด ์ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค!!!
ํน์ 'Cannot call value of non-function type 'module<Framework>' ๋ผ๋ ์๋ฌ๊ฐ ๋ฌ๋ค๋ฉด
ํด๋น ํด๋์ค์์ Target Membership์ ํ๋ ์์ํฌ ์ด๋ฆ์ผ๋ก ๋ ๊ฒ์ด ์ฒดํฌ๊ฐ ๋์ด์๋์ง ํ์ธํด์ฃผ์ธ์.
์๋์ด ์๋ค๋ฉด ์ฒดํฌํด์ค๋๋ค.
์ค๋์ ์ด๋ ๊ฒ ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ ์ ๋ฐ์ดํธํ๊ณ ์ฌ์ฉํด๋ณด์๋๋ฐ์.
์ธ์ ๊ฐ๋ ๊ผญ ํด์ผ์ง..๋ฏธ๋ฃจ๋ค ๋ฏธ๋ฃจ๋ค ์ด๋ฒ์ ํ๋๋ฐ ์ ๋ง ๋ฟ๋ฏํ๋ค์!
ํน์๋ผ๋ ํ๋ฆฐ ์ ์ด ์๊ฑฐ๋ ๊ถ๊ธํ์ ์ ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
Reference
์ผ์ผ๋ ๊ธ์ ์ฐธ๊ณ ํ์์ต๋๋ค.
๋๊ธ