cocoapods 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/cocoapods.rb +3 -1
- data/lib/cocoapods/command/install.rb +11 -7
- data/lib/cocoapods/command/repo.rb +1 -1
- data/lib/cocoapods/installer.rb +62 -2
- data/lib/cocoapods/project_template.rb +35 -0
- data/lib/cocoapods/xcode/project.rb +65 -40
- data/lib/cocoapods/xcode/workspace.rb +56 -0
- metadata +13 -8
data/lib/cocoapods.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Pod
|
2
|
-
VERSION = '0.
|
2
|
+
VERSION = '0.2.0'
|
3
3
|
|
4
4
|
class Informative < StandardError
|
5
5
|
end
|
@@ -12,6 +12,7 @@ module Pod
|
|
12
12
|
autoload :Executable, 'cocoapods/executable'
|
13
13
|
autoload :Installer, 'cocoapods/installer'
|
14
14
|
autoload :Podfile, 'cocoapods/podfile'
|
15
|
+
autoload :ProjectTemplate, 'cocoapods/project_template'
|
15
16
|
autoload :Resolver, 'cocoapods/resolver'
|
16
17
|
autoload :Source, 'cocoapods/source'
|
17
18
|
autoload :Spec, 'cocoapods/specification'
|
@@ -22,6 +23,7 @@ module Pod
|
|
22
23
|
autoload :Config, 'cocoapods/xcode/config'
|
23
24
|
autoload :CopyResourcesScript, 'cocoapods/xcode/copy_resources_script'
|
24
25
|
autoload :Project, 'cocoapods/xcode/project'
|
26
|
+
autoload :Workspace, 'cocoapods/xcode/workspace'
|
25
27
|
end
|
26
28
|
|
27
29
|
autoload :Pathname, 'pathname'
|
@@ -4,10 +4,11 @@ module Pod
|
|
4
4
|
def self.banner
|
5
5
|
%{Installing dependencies of a pod spec:
|
6
6
|
|
7
|
-
$ pod install [NAME]
|
7
|
+
$ pod install [NAME] [PROJECT]
|
8
8
|
|
9
|
-
Downloads all dependencies of the specified podspec file `NAME'
|
10
|
-
creates an Xcode Pods library project in `./Pods'
|
9
|
+
Downloads all dependencies of the specified podspec file `NAME',
|
10
|
+
creates an Xcode Pods library project in `./Pods', and sets up `PROJECT'
|
11
|
+
to use the specified pods (if `PROJECT' is given). In case `NAME' is
|
11
12
|
omitted it defaults to either `Podfile' or `*.podspec' in the current
|
12
13
|
working directory.
|
13
14
|
}
|
@@ -20,9 +21,10 @@ module Pod
|
|
20
21
|
|
21
22
|
def initialize(argv)
|
22
23
|
config.clean = !argv.option('--no-clean')
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
projpath = argv.shift_argument
|
25
|
+
projpath =~ /\.xcodeproj\/?$/ ? @projpath = projpath : podspec = projpath
|
26
|
+
@podspec = Pathname.new(podspec) if podspec
|
27
|
+
@projpath ||= argv.shift_argument
|
26
28
|
super unless argv.empty?
|
27
29
|
end
|
28
30
|
|
@@ -39,7 +41,9 @@ module Pod
|
|
39
41
|
raise Informative, "No `Podfile' or `.podspec' file found in the current working directory."
|
40
42
|
end
|
41
43
|
end
|
42
|
-
Installer.new(spec)
|
44
|
+
installer = Installer.new(spec)
|
45
|
+
installer.install!
|
46
|
+
installer.configure_project(@projpath) if @projpath
|
43
47
|
end
|
44
48
|
end
|
45
49
|
end
|
@@ -44,7 +44,7 @@ module Pod
|
|
44
44
|
def add
|
45
45
|
puts "==> Cloning spec repo `#{@name}' from `#{@url}'" unless config.silent?
|
46
46
|
config.repos_dir.mkpath
|
47
|
-
Dir.chdir(config.repos_dir) { git("clone #{@url} #{@name}") }
|
47
|
+
Dir.chdir(config.repos_dir) { git("clone '#{@url}' #{@name}") }
|
48
48
|
end
|
49
49
|
|
50
50
|
def update
|
data/lib/cocoapods/installer.rb
CHANGED
@@ -29,8 +29,12 @@ module Pod
|
|
29
29
|
})
|
30
30
|
end
|
31
31
|
|
32
|
+
def template
|
33
|
+
@template ||= ProjectTemplate.new(@specification.platform)
|
34
|
+
end
|
35
|
+
|
32
36
|
def xcodeproj
|
33
|
-
@xcodeproj ||= Xcode::Project.
|
37
|
+
@xcodeproj ||= Xcode::Project.new(template.xcodeproj_path)
|
34
38
|
end
|
35
39
|
|
36
40
|
# TODO move xcconfig related code into the xcconfig method, like copy_resources_script and generate_bridge_support.
|
@@ -79,7 +83,11 @@ module Pod
|
|
79
83
|
generate_project
|
80
84
|
|
81
85
|
root = config.project_pods_root
|
82
|
-
|
86
|
+
puts " * Copying contents of template directory `#{template.path}' to `#{root}'" if config.verbose?
|
87
|
+
template.copy_to(root)
|
88
|
+
pbxproj = File.join(root, 'Pods.xcodeproj')
|
89
|
+
puts " * Writing Xcode project file to `#{pbxproj}'" if config.verbose?
|
90
|
+
xcodeproj.save_as(pbxproj)
|
83
91
|
xcconfig.create_in(root)
|
84
92
|
if @specification.generate_bridge_support?
|
85
93
|
path = bridge_support_generator.create_in(root)
|
@@ -89,5 +97,57 @@ module Pod
|
|
89
97
|
|
90
98
|
build_specifications.each(&:post_install)
|
91
99
|
end
|
100
|
+
|
101
|
+
def configure_project(projpath)
|
102
|
+
root = File.dirname(projpath)
|
103
|
+
xcworkspace = File.join(root, File.basename(projpath, '.xcodeproj') + '.xcworkspace')
|
104
|
+
workspace = Xcode::Workspace.new_from_xcworkspace(xcworkspace)
|
105
|
+
pods_projpath = File.join(config.project_pods_root, 'Pods.xcodeproj')
|
106
|
+
root = Pathname.new(root).expand_path
|
107
|
+
[projpath, pods_projpath].each do |path|
|
108
|
+
path = Pathname.new(path).expand_path.relative_path_from(root).to_s
|
109
|
+
workspace << path unless workspace.include? path
|
110
|
+
end
|
111
|
+
workspace.save_as(xcworkspace)
|
112
|
+
|
113
|
+
app_project = Xcode::Project.new(projpath)
|
114
|
+
return if app_project.files.find { |file| file.path =~ /libPods\.a$/ }
|
115
|
+
|
116
|
+
configfile = app_project.files.new({
|
117
|
+
'path' => 'Pods/Pods.xcconfig',
|
118
|
+
'lastKnownFileType' => 'text.xcconfig'
|
119
|
+
})
|
120
|
+
app_project.targets.each do |target|
|
121
|
+
target.buildConfigurationList.buildConfigurations.each do |config|
|
122
|
+
config.baseConfigurationReference = configfile
|
123
|
+
end
|
124
|
+
end
|
125
|
+
app_project.main_group << configfile
|
126
|
+
|
127
|
+
libfile = app_project.files.new({
|
128
|
+
'path' => 'libPods.a',
|
129
|
+
'lastKnownFileType' => 'archive.ar',
|
130
|
+
'includeInIndex' => '0',
|
131
|
+
'sourceTree' => 'BUILT_PRODUCTS_DIR'
|
132
|
+
})
|
133
|
+
app_project.objects.select_by_class(Xcode::Project::PBXFrameworksBuildPhase).each do |build_phase|
|
134
|
+
build_phase.files << libfile.build_file
|
135
|
+
end
|
136
|
+
app_project.main_group << libfile
|
137
|
+
|
138
|
+
copy_resources = app_project.objects.add(Xcode::Project::PBXShellScriptBuildPhase, {
|
139
|
+
'name' => 'Copy Pods Resources',
|
140
|
+
'buildActionMask' => '2147483647',
|
141
|
+
'files' => [],
|
142
|
+
'inputPaths' => [],
|
143
|
+
'outputPaths' => [],
|
144
|
+
'runOnlyForDeploymentPostprocessing' => '0',
|
145
|
+
'shellPath' => '/bin/sh',
|
146
|
+
'shellScript' => "${SRCROOT}/Pods/PodsResources.sh\n"
|
147
|
+
})
|
148
|
+
app_project.targets.each { |target| target.buildPhases << copy_resources }
|
149
|
+
|
150
|
+
app_project.save_as(projpath)
|
151
|
+
end
|
92
152
|
end
|
93
153
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Pod
|
4
|
+
class ProjectTemplate
|
5
|
+
def initialize(platform)
|
6
|
+
@platform = platform
|
7
|
+
end
|
8
|
+
|
9
|
+
# TODO this is a workaround for an issue with MacRuby with compiled files
|
10
|
+
# that makes the use of __FILE__ impossible.
|
11
|
+
#
|
12
|
+
#TEMPLATES_DIR = Pathname.new(File.expand_path('../../../xcode-project-templates', __FILE__))
|
13
|
+
file = $LOADED_FEATURES.find { |file| file =~ %r{cocoapods/project_template\.rbo?$} }
|
14
|
+
TEMPLATES_DIR = Pathname.new(File.expand_path('../../../xcode-project-templates', file))
|
15
|
+
|
16
|
+
def path
|
17
|
+
@path ||= case @platform
|
18
|
+
when :osx
|
19
|
+
TEMPLATES_DIR + 'cocoa-static-library'
|
20
|
+
when :ios
|
21
|
+
TEMPLATES_DIR + 'cocoa-touch-static-library'
|
22
|
+
else
|
23
|
+
raise "No Xcode project template exists for the platform `#{platform.inspect}'"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def xcodeproj_path
|
28
|
+
@xcodeproj_path = File.join(path, 'Pods.xcodeproj')
|
29
|
+
end
|
30
|
+
|
31
|
+
def copy_to(pods_root)
|
32
|
+
FileUtils.cp_r("#{path}/.", pods_root)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -88,6 +88,10 @@ module Pod
|
|
88
88
|
end
|
89
89
|
file
|
90
90
|
end
|
91
|
+
|
92
|
+
def <<(child)
|
93
|
+
children << child.uuid
|
94
|
+
end
|
91
95
|
end
|
92
96
|
|
93
97
|
class PBXFileReference < PBXObject
|
@@ -122,7 +126,7 @@ module Pod
|
|
122
126
|
|
123
127
|
# Returns a PBXFileReference instance corresponding to the uuid in the fileRef attribute.
|
124
128
|
def file
|
125
|
-
project.objects[fileRef]
|
129
|
+
@project.objects[fileRef]
|
126
130
|
end
|
127
131
|
end
|
128
132
|
|
@@ -140,17 +144,60 @@ module Pod
|
|
140
144
|
list_by_class(file_uuids, PBXBuildFile)
|
141
145
|
end
|
142
146
|
end
|
143
|
-
|
144
|
-
class
|
147
|
+
|
148
|
+
class PBXSourcesBuildPhase < PBXBuildPhase; end
|
149
|
+
class PBXCopyFilesBuildPhase < PBXBuildPhase; end
|
150
|
+
class PBXFrameworksBuildPhase < PBXBuildPhase; end
|
151
|
+
class PBXShellScriptBuildPhase < PBXBuildPhase
|
152
|
+
attributes_accessor :shellScript
|
153
|
+
end
|
145
154
|
|
146
155
|
class PBXNativeTarget < PBXObject
|
147
|
-
attributes_accessor :buildPhases
|
156
|
+
attributes_accessor :buildPhases, :buildConfigurationList
|
148
157
|
alias_method :build_phase_uuids, :buildPhases
|
149
158
|
alias_method :build_phase_uuids=, :buildPhases=
|
159
|
+
alias_method :build_configuration_list_uuid, :buildConfigurationList
|
160
|
+
alias_method :build_configuration_list_uuid=, :buildConfigurationList=
|
150
161
|
|
151
162
|
def buildPhases
|
152
163
|
list_by_class(build_phase_uuids, PBXBuildPhase)
|
153
164
|
end
|
165
|
+
|
166
|
+
def buildConfigurationList
|
167
|
+
@project.objects[build_configuration_list_uuid]
|
168
|
+
end
|
169
|
+
|
170
|
+
def buildConfigurationList=(config_list)
|
171
|
+
self.build_configuration_list_uuid = config_list.uuid
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class XCBuildConfiguration < PBXObject
|
176
|
+
attributes_accessor :baseConfigurationReference
|
177
|
+
alias_method :base_configuration_reference_uuid, :baseConfigurationReference
|
178
|
+
alias_method :base_configuration_reference_uuid=, :baseConfigurationReference=
|
179
|
+
|
180
|
+
def baseConfigurationReference
|
181
|
+
@project.objects[base_configuration_reference_uuid]
|
182
|
+
end
|
183
|
+
|
184
|
+
def baseConfigurationReference=(config)
|
185
|
+
self.base_configuration_reference_uuid = config.uuid
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class XCConfigurationList < PBXObject
|
190
|
+
attributes_accessor :buildConfigurations
|
191
|
+
alias_method :build_configuration_uuids, :buildConfigurations
|
192
|
+
alias_method :build_configuration_uuids=, :buildConfigurations=
|
193
|
+
|
194
|
+
def buildConfigurations
|
195
|
+
list_by_class(build_configuration_uuids, XCBuildConfiguration)
|
196
|
+
end
|
197
|
+
|
198
|
+
def buildConfigurations=(configs)
|
199
|
+
self.build_configuration_uuids = configs.map(&:uuid)
|
200
|
+
end
|
154
201
|
end
|
155
202
|
|
156
203
|
# Missing constants that begin with either `PBX' or `XC' are assumed to be
|
@@ -215,42 +262,17 @@ module Pod
|
|
215
262
|
end
|
216
263
|
end
|
217
264
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
# that makes the use of __FILE__ impossible.
|
222
|
-
#
|
223
|
-
#TEMPLATES_DIR = Pathname.new(File.expand_path('../../../../xcode-project-templates', __FILE__))
|
224
|
-
file = $LOADED_FEATURES.find { |file| file =~ %r{cocoapods/xcode/project\.rbo?$} }
|
225
|
-
TEMPLATES_DIR = Pathname.new(File.expand_path('../../../../xcode-project-templates', file))
|
226
|
-
|
227
|
-
def self.static_library(platform)
|
228
|
-
case platform
|
229
|
-
when :osx
|
230
|
-
new TEMPLATES_DIR + 'cocoa-static-library'
|
231
|
-
when :ios
|
232
|
-
new TEMPLATES_DIR + 'cocoa-touch-static-library'
|
233
|
-
else
|
234
|
-
raise "No Xcode project template exists for the platform `#{platform.inspect}'"
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
def initialize(template_dir)
|
239
|
-
@template_dir = template_dir
|
240
|
-
file = template_dir + template_file
|
241
|
-
@template = NSMutableDictionary.dictionaryWithContentsOfFile(file.to_s)
|
242
|
-
end
|
243
|
-
|
244
|
-
def template_file
|
245
|
-
'Pods.xcodeproj/project.pbxproj'
|
265
|
+
def initialize(xcodeproj)
|
266
|
+
file = File.join(xcodeproj, 'project.pbxproj')
|
267
|
+
@plist = NSMutableDictionary.dictionaryWithContentsOfFile(file.to_s)
|
246
268
|
end
|
247
269
|
|
248
270
|
def to_hash
|
249
|
-
@
|
271
|
+
@plist
|
250
272
|
end
|
251
273
|
|
252
274
|
def objects_hash
|
253
|
-
@
|
275
|
+
@plist['objects']
|
254
276
|
end
|
255
277
|
|
256
278
|
def objects
|
@@ -260,6 +282,11 @@ module Pod
|
|
260
282
|
def groups
|
261
283
|
objects.select_by_class(PBXGroup)
|
262
284
|
end
|
285
|
+
|
286
|
+
def main_group
|
287
|
+
project = objects[@plist['rootObject']]
|
288
|
+
objects[project.attributes['mainGroup']]
|
289
|
+
end
|
263
290
|
|
264
291
|
# Shortcut access to the `Pods' PBXGroup.
|
265
292
|
def pods
|
@@ -301,12 +328,10 @@ module Pod
|
|
301
328
|
source_files
|
302
329
|
end
|
303
330
|
|
304
|
-
def
|
305
|
-
|
306
|
-
FileUtils.
|
307
|
-
pbxproj
|
308
|
-
puts " * Writing Xcode project file to `#{pbxproj}'" if config.verbose?
|
309
|
-
@template.writeToFile(pbxproj.to_s, atomically:true)
|
331
|
+
def save_as(projpath)
|
332
|
+
projpath = projpath.to_s
|
333
|
+
FileUtils.mkdir_p(projpath)
|
334
|
+
@plist.writeToFile(File.join(projpath, 'project.pbxproj'), atomically:true)
|
310
335
|
end
|
311
336
|
|
312
337
|
# TODO add comments, or even constants, describing what these magic numbers are.
|
@@ -0,0 +1,56 @@
|
|
1
|
+
framework 'Foundation'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Pod
|
5
|
+
module Xcode
|
6
|
+
class Workspace
|
7
|
+
def initialize(*projpaths)
|
8
|
+
@projpaths = projpaths
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.new_from_xcworkspace(path)
|
12
|
+
begin
|
13
|
+
from_s(File.read(File.join(path, 'contents.xcworkspacedata')))
|
14
|
+
rescue Errno::ENOENT
|
15
|
+
new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_s(xml)
|
20
|
+
doc = NSXMLDocument.alloc.initWithXMLString(xml, options:0, error:nil)
|
21
|
+
projpaths = doc.nodesForXPath("/Workspace/FileRef", error:nil).map do |node|
|
22
|
+
node.attributeForName("location").stringValue.sub(/^group:/, '')
|
23
|
+
end
|
24
|
+
new(*projpaths)
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :projpaths
|
28
|
+
|
29
|
+
def <<(projpath)
|
30
|
+
@projpaths << projpath
|
31
|
+
end
|
32
|
+
|
33
|
+
def include?(projpath)
|
34
|
+
@projpaths.include?(projpath)
|
35
|
+
end
|
36
|
+
|
37
|
+
TEMPLATE = %q[<?xml version="1.0" encoding="UTF-8"?><Workspace version="1.0"></Workspace>]
|
38
|
+
def to_s
|
39
|
+
doc = NSXMLDocument.alloc.initWithXMLString(TEMPLATE, options:0, error:nil)
|
40
|
+
@projpaths.each do |projpath|
|
41
|
+
el = NSXMLNode.elementWithName("FileRef")
|
42
|
+
el.addAttribute(NSXMLNode.attributeWithName("location", stringValue:"group:#{projpath}"))
|
43
|
+
doc.rootElement.addChild(el)
|
44
|
+
end
|
45
|
+
NSString.alloc.initWithData(doc.XMLData, encoding:NSUTF8StringEncoding)
|
46
|
+
end
|
47
|
+
|
48
|
+
def save_as(path)
|
49
|
+
FileUtils.mkdir_p(path)
|
50
|
+
File.open(File.join(path, 'contents.xcworkspacedata'), 'w') do |out|
|
51
|
+
out << to_s
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Eloy Duran
|
@@ -14,8 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2011-09-17 00:00:00
|
18
|
-
default_executable:
|
18
|
+
date: 2011-09-17 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: |-
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/cocoapods/executable.rb
|
43
43
|
- lib/cocoapods/installer.rb
|
44
44
|
- lib/cocoapods/podfile.rb
|
45
|
+
- lib/cocoapods/project_template.rb
|
45
46
|
- lib/cocoapods/resolver.rb
|
46
47
|
- lib/cocoapods/source.rb
|
47
48
|
- lib/cocoapods/specification/set.rb
|
@@ -50,6 +51,7 @@ files:
|
|
50
51
|
- lib/cocoapods/xcode/config.rb
|
51
52
|
- lib/cocoapods/xcode/copy_resources_script.rb
|
52
53
|
- lib/cocoapods/xcode/project.rb
|
54
|
+
- lib/cocoapods/xcode/workspace.rb
|
53
55
|
- lib/cocoapods.rb
|
54
56
|
- xcode-project-templates/cocoa-static-library/Pods-Prefix.pch
|
55
57
|
- xcode-project-templates/cocoa-static-library/Pods.xcconfig
|
@@ -62,7 +64,6 @@ files:
|
|
62
64
|
- bin/pod
|
63
65
|
- README.md
|
64
66
|
- LICENSE
|
65
|
-
has_rdoc: true
|
66
67
|
homepage: https://github.com/alloy/cocoapods
|
67
68
|
licenses:
|
68
69
|
- MIT
|
@@ -77,23 +78,27 @@ rdoc_options: []
|
|
77
78
|
require_paths:
|
78
79
|
- lib
|
79
80
|
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
80
82
|
requirements:
|
81
83
|
- - ">="
|
82
84
|
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
83
86
|
segments:
|
84
87
|
- 0
|
85
88
|
version: "0"
|
86
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
87
91
|
requirements:
|
88
92
|
- - ">="
|
89
93
|
- !ruby/object:Gem::Version
|
94
|
+
hash: 3
|
90
95
|
segments:
|
91
96
|
- 0
|
92
97
|
version: "0"
|
93
98
|
requirements: []
|
94
99
|
|
95
100
|
rubyforge_project:
|
96
|
-
rubygems_version: 1.
|
101
|
+
rubygems_version: 1.8.7
|
97
102
|
signing_key:
|
98
103
|
specification_version: 3
|
99
104
|
summary: A simple Objective-C library package manager. (Requires MacRuby.)
|