gonative-cli 0.7.17 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/gonative/commands/ios/embed_extensions.rb +15 -0
- data/lib/gonative/commands/ios/extract_extensions.rb +17 -0
- data/lib/gonative/commands/ios/publish.rb +3 -3
- data/lib/gonative/commands/ios/set_bundle_id.rb +18 -0
- data/lib/gonative/commands.rb +3 -0
- data/lib/gonative/plugins/ios/build_framework.rb +16 -3
- data/lib/gonative/plugins/ios/embed_extensions.rb +72 -0
- data/lib/gonative/plugins/ios/extract_extensions.rb +87 -0
- data/lib/gonative/plugins/ios/release.rb +1 -1
- data/lib/gonative/plugins/ios/set_bundle_id.rb +65 -0
- data/lib/gonative/version.rb +1 -1
- data/templates/build/ios/PLUGIN_NAME-umbrella.h.tpl +16 -0
- data/templates/build/ios/PLUGIN_NAME.modulemap.tpl +6 -0
- data/templates/plugins/ios/common/PLUGIN_NAME.podspec.tpl +1 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 392a2b4ff0ecb66ee524f2b0843f2aa334c22c0bd2723bb28a569e9318bdb111
|
4
|
+
data.tar.gz: efce28573e1fd80d0a408ad0c62fd48d687c791efa05ea90dd096fc2fc748d0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 446b75f6fd9d62edb92c3ba57ef32837e64fcb02834dcbb26c2abe146eebe083fce59bf34fcf3f90f1d2f4db2256d59bc0232a2ae36a4263344c192293650793
|
7
|
+
data.tar.gz: b0732cacf207e93be3b22cec558a6cb87307ef7b627cd68f2b1b63bf1363c0fce6c48f4baa2d7e4bb8d712053440fed962fec065f0074a1b20b5a7a34f07ec59
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GoNative
|
4
|
+
module Commands
|
5
|
+
module IOS
|
6
|
+
class EmbedExtensions < Base
|
7
|
+
desc 'Embeds all extensions from plugins to the project'
|
8
|
+
|
9
|
+
def call(**)
|
10
|
+
Plugins::IOS::EmbedExtensions.call
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GoNative
|
4
|
+
module Commands
|
5
|
+
module IOS
|
6
|
+
class ExtractExtensions < Base
|
7
|
+
desc 'Extracts extension targets from a project'
|
8
|
+
|
9
|
+
argument :path, required: false, desc: 'Path to the xcodeproj'
|
10
|
+
|
11
|
+
def call(path:, **)
|
12
|
+
Plugins::IOS::ExtractExtensions.call(path)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -4,15 +4,15 @@ module GoNative
|
|
4
4
|
module Commands
|
5
5
|
module IOS
|
6
6
|
class Publish < Base
|
7
|
+
autoload :FileUtils, 'fileutils'
|
7
8
|
desc 'Verify, build and release a new version'
|
8
|
-
argument :name, required: true, desc: 'Name of the plugin'
|
9
9
|
option :skip_build, type: :boolean, default: false
|
10
10
|
option :debug, type: :boolean, default: false
|
11
11
|
option :archs, default: 'x86_64,arm64'
|
12
12
|
|
13
|
-
def call(
|
13
|
+
def call(skip_build:, debug:, archs:, **)
|
14
14
|
Plugins::IOS::Verify.call
|
15
|
-
Plugins::IOS::BuildFramework.call(
|
15
|
+
Plugins::IOS::BuildFramework.call(archs, debug) unless skip_build
|
16
16
|
Plugins::IOS::Release.call
|
17
17
|
end
|
18
18
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GoNative
|
4
|
+
module Commands
|
5
|
+
module IOS
|
6
|
+
class SetBundleId < Base
|
7
|
+
desc 'Sets bundle Id '
|
8
|
+
|
9
|
+
argument :bundle_id, required: true, desc: 'Bundle id for the app'
|
10
|
+
option :with_entitlements, type: :boolean, default: false
|
11
|
+
|
12
|
+
def call(bundle_id:, with_entitlements:, **)
|
13
|
+
Plugins::IOS::SetBundleId.call(bundle_id, with_entitlements)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/gonative/commands.rb
CHANGED
@@ -7,6 +7,9 @@ module GoNative
|
|
7
7
|
register 'version', Version, aliases: %w[--version -v]
|
8
8
|
register 'ios create', IOS::Create
|
9
9
|
register 'ios publish', IOS::Publish
|
10
|
+
register 'ios extract-extensions', IOS::ExtractExtensions
|
11
|
+
register 'ios embed-extensions', IOS::EmbedExtensions
|
12
|
+
register 'ios set-bundle-id', IOS::SetBundleId
|
10
13
|
register 'android create', Android::Create
|
11
14
|
end
|
12
15
|
end
|
@@ -16,8 +16,11 @@ module GoNative
|
|
16
16
|
|
17
17
|
attr_reader :plugin_name, :archs, :persist_build_dir
|
18
18
|
|
19
|
-
def initialize(
|
20
|
-
|
19
|
+
def initialize(archs, persist_build_dir)
|
20
|
+
podspec_file = Dir["./*.podspec"].first
|
21
|
+
raise Error, "No podspec exists." unless podspec_file
|
22
|
+
|
23
|
+
@plugin_name = File.basename(podspec_file, '.podspec')
|
21
24
|
@archs = archs.gsub(',', ' ')
|
22
25
|
@persist_build_dir = persist_build_dir
|
23
26
|
end
|
@@ -49,10 +52,18 @@ module GoNative
|
|
49
52
|
deployment_target)
|
50
53
|
main_group = proj.new_group(plugin_name, plugin_name)
|
51
54
|
classes_group = main_group.new_group('Classes', 'Classes')
|
52
|
-
references = Dir.glob("../#{plugin_name}/Classes
|
55
|
+
references = Dir.glob("../#{plugin_name}/Classes/**/*.{m,swift}").map{ |file| classes_group.new_file("../../#{file}") }
|
53
56
|
target.add_file_references(references)
|
57
|
+
references = Dir.glob("../#{plugin_name}/Classes/**/*.h").map{ |file| classes_group.new_file("../../#{file}") }
|
58
|
+
header_files = target.add_file_references(references)
|
59
|
+
header_files << target.headers_build_phase.add_file_reference(main_group.new_file("../#{plugin_name}-umbrella.h"))
|
60
|
+
header_files.each do |header|
|
61
|
+
header.settings = { 'ATTRIBUTES' => ['Public'] }
|
62
|
+
end
|
54
63
|
target.build_configurations.each do |config|
|
55
64
|
config.build_settings['GENERATE_INFOPLIST_FILE'] = 'YES'
|
65
|
+
config.build_settings['MODULEMAP_FILE'] = "#{plugin_name}.modulemap"
|
66
|
+
config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = "org.cocoapods.#{plugin_name}"
|
56
67
|
end
|
57
68
|
proj.save("#{plugin_name}.xcodeproj")
|
58
69
|
end
|
@@ -60,8 +71,10 @@ module GoNative
|
|
60
71
|
def move_template_files
|
61
72
|
plugin_dependencies = spec.dependencies.map{|d| ["pod '#{d.name}'", "'#{d.requirement}'"].compact.join(', ') } * "\n\t"
|
62
73
|
FileUtils.cp_r("#{BUILD_TEMPLATE_DIRECTORY_PATH}/.", '.')
|
74
|
+
headers = Dir.glob("../#{plugin_name}/Classes/**/*.h").map{ |f| "#import \"#{File.basename(f)}\"" } * "\n"
|
63
75
|
Utils::TemplateInflator.new(plugin_name: plugin_name,
|
64
76
|
plugin_dependencies: plugin_dependencies,
|
77
|
+
plugin_headers: headers,
|
65
78
|
archs: archs,
|
66
79
|
deployment_target: deployment_target
|
67
80
|
).call
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'xcodeproj'
|
5
|
+
|
6
|
+
module GoNative
|
7
|
+
module Plugins
|
8
|
+
module IOS
|
9
|
+
class EmbedExtensions
|
10
|
+
extend DSL::Serviceable
|
11
|
+
autoload :FileUtils, 'fileutils'
|
12
|
+
|
13
|
+
attr_reader :extensions
|
14
|
+
|
15
|
+
def call
|
16
|
+
prepare_extensions
|
17
|
+
embed_in_project
|
18
|
+
modify_podfile
|
19
|
+
end
|
20
|
+
|
21
|
+
def prepare_extensions
|
22
|
+
extension_paths = `find ./Pods -iname Extensions -not -empty -type d`.split("\n")
|
23
|
+
extension_paths
|
24
|
+
.map { |path| Pathname(path).children.select(&:directory?) }
|
25
|
+
.flatten
|
26
|
+
.each { |path| FileUtils.cp_r(path, '.') }
|
27
|
+
@extensions = extension_paths
|
28
|
+
.map { |path| Pathname(path).children.select { |p| p.extname == '.json' } }
|
29
|
+
.flatten
|
30
|
+
.map { |p| JSON.parse(File.read(p)) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def embed_in_project
|
34
|
+
proj = Xcodeproj::Project.open('GoNativeIOS.xcodeproj')
|
35
|
+
extensions.each do |extension|
|
36
|
+
target = proj.new_target(:app_extension,
|
37
|
+
extension['name'],
|
38
|
+
:ios,
|
39
|
+
'11.0')
|
40
|
+
extension_group = proj.new_group(extension['name'], extension['name'])
|
41
|
+
|
42
|
+
extension['headers'].each { |path| extension_group.new_file(path) }
|
43
|
+
target.add_file_references(extension['source_files'].map { |path| extension_group.new_file(path) })
|
44
|
+
target.add_resources(extension['resources'].map { |path| extension_group.new_file(path) })
|
45
|
+
target.add_system_frameworks(extension['system_frameworks'])
|
46
|
+
extension_group.new_file(extension['info'])
|
47
|
+
extension_group.new_file(extension['entitlements']) if extension['entitlements']
|
48
|
+
target.build_configurations.each do |config|
|
49
|
+
config.build_settings['INFOPLIST_FILE'] = "#{extension['name']}/#{extension['info']}"
|
50
|
+
config.build_settings['CODE_SIGN_ENTITLEMENTS'] = "#{extension['name']}/#{extension['entitlements']}" if extension['entitlements']
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
proj.save
|
55
|
+
end
|
56
|
+
|
57
|
+
def modify_podfile
|
58
|
+
extensions.each do |extension|
|
59
|
+
open('Podfile', 'a') do |f|
|
60
|
+
f.puts "target '#{extension['name']}' do"
|
61
|
+
f.puts "\tuse_frameworks!"
|
62
|
+
extension['dependencies'].each do |dep|
|
63
|
+
f.puts "\tpod #{dep['name']}, #{dep['requirement']}"
|
64
|
+
end
|
65
|
+
f.puts "end"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cocoapods'
|
4
|
+
require 'xcodeproj'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module GoNative
|
8
|
+
module Plugins
|
9
|
+
module IOS
|
10
|
+
class ExtractExtensions
|
11
|
+
extend DSL::Serviceable
|
12
|
+
autoload :FileUtils, 'fileutils'
|
13
|
+
|
14
|
+
attr_reader :proj_path
|
15
|
+
|
16
|
+
def initialize(path)
|
17
|
+
@proj_path = path
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
original_path = FileUtils.pwd
|
22
|
+
FileUtils.cd(File.dirname(proj_path))
|
23
|
+
proj = Xcodeproj::Project.open(proj_path)
|
24
|
+
extension_targets = proj.targets.select { |target| target.product_type == Xcodeproj::Constants::PRODUCT_TYPE_UTI[:app_extension] }
|
25
|
+
|
26
|
+
extension_targets.each do |target|
|
27
|
+
extension_name = target.name
|
28
|
+
extension_path = "Extensions/#{target.name}"
|
29
|
+
|
30
|
+
target_definition = {}
|
31
|
+
target_definition[:name] = extension_name
|
32
|
+
|
33
|
+
FileUtils.cd(extension_name)
|
34
|
+
target_definition[:info] = `find . -name '*Info.plist'`.split("\n").first
|
35
|
+
target_definition[:entitlements] = `find -E . -regex ".*\.(entitlements)"`.split("\n").first
|
36
|
+
target_definition[:headers] = `find -E . -regex ".*\.(h)"`.split("\n")
|
37
|
+
target_definition[:source_files] = `find -E . -regex ".*\.(m|swift)"`.split("\n")
|
38
|
+
target_definition[:resources] = target
|
39
|
+
.resources_build_phase
|
40
|
+
.files
|
41
|
+
.map(&:file_ref)
|
42
|
+
.map(&:name)
|
43
|
+
.map { |name| `find . -name #{name}`.strip }
|
44
|
+
|
45
|
+
target_definition[:system_frameworks] = target
|
46
|
+
.frameworks_build_phase
|
47
|
+
.files
|
48
|
+
.map(&:file_ref)
|
49
|
+
.map(&:path)
|
50
|
+
.select{|p| p.start_with? 'System'}
|
51
|
+
.map{ |p| File.basename(p)}
|
52
|
+
|
53
|
+
target_definition[:dependencies] = podfile.target_definitions[extension_name].dependencies.map do |dependency|
|
54
|
+
{
|
55
|
+
name: dependency.name,
|
56
|
+
requirement: dependency.requirement.requirements.map { |r| r.map(&:to_s).join(' ') }.join(', ')
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
target_definition.slice(:info, :entitlements, :headers, :source_files, :resources).values.compact.flatten.each do |file_path|
|
61
|
+
system('ditto', file_path, "#{original_path}/#{extension_path}/#{file_path}")
|
62
|
+
end
|
63
|
+
|
64
|
+
File.open("#{original_path}/#{extension_path}.json","w") do |f|
|
65
|
+
f.write(JSON.pretty_generate(target_definition))
|
66
|
+
end
|
67
|
+
|
68
|
+
FileUtils.cd('..')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def podfile
|
73
|
+
@podfile ||= Pod::Podfile.from_file(Pathname.new(File.dirname(proj_path) + '/Podfile'))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# //:configuration = Debug
|
81
|
+
# CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements
|
82
|
+
#
|
83
|
+
# //:configuration = Release
|
84
|
+
# CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements
|
85
|
+
#
|
86
|
+
# //:completeSettings = some
|
87
|
+
# CODE_SIGN_ENTITLEMENTS
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'xcodeproj'
|
4
|
+
require 'cfpropertylist'
|
5
|
+
|
6
|
+
module GoNative
|
7
|
+
module Plugins
|
8
|
+
module IOS
|
9
|
+
class SetBundleId
|
10
|
+
extend DSL::Serviceable
|
11
|
+
|
12
|
+
attr_reader :bundle_id
|
13
|
+
|
14
|
+
def initialize(bundle_id, update_entitlements)
|
15
|
+
@bundle_id = bundle_id
|
16
|
+
@update_entitlements = update_entitlements
|
17
|
+
end
|
18
|
+
|
19
|
+
def call
|
20
|
+
update_project
|
21
|
+
update_entitlements if update_entitlements?
|
22
|
+
end
|
23
|
+
|
24
|
+
def update_project
|
25
|
+
proj = Xcodeproj::Project.open('./GoNativeIOS.xcodeproj')
|
26
|
+
proj.targets.each do |target|
|
27
|
+
case target.product_type
|
28
|
+
when Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]
|
29
|
+
set_target_bundle_id(target, bundle_id)
|
30
|
+
when Xcodeproj::Constants::PRODUCT_TYPE_UTI[:app_extension]
|
31
|
+
set_target_bundle_id(target, bundle_id + '.' + target.name)
|
32
|
+
else
|
33
|
+
next
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
proj.save
|
38
|
+
end
|
39
|
+
|
40
|
+
def update_entitlements
|
41
|
+
entitlement_files = `find -E . -maxdepth 2 -regex ".*\.(entitlements)"`.split("\n")
|
42
|
+
entitlement_files.each do |entitlement_file|
|
43
|
+
plist = CFPropertyList::List.new(file: entitlement_file)
|
44
|
+
entitlements = CFPropertyList.native_types(plist.value)
|
45
|
+
entitlements['com.apple.security.application-groups'] = ['group.' + bundle_id]
|
46
|
+
plist.value = CFPropertyList.guess(entitlements)
|
47
|
+
plist.save(entitlement_file, CFPropertyList::List::FORMAT_XML)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def set_target_bundle_id(target, bundle_id)
|
54
|
+
target.build_configurations.each do |config|
|
55
|
+
config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def update_entitlements?
|
60
|
+
@update_entitlements
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/gonative/version.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
#ifdef __OBJC__
|
2
|
+
#import <UIKit/UIKit.h>
|
3
|
+
#else
|
4
|
+
#ifndef FOUNDATION_EXPORT
|
5
|
+
#if defined(__cplusplus)
|
6
|
+
#define FOUNDATION_EXPORT extern "C"
|
7
|
+
#else
|
8
|
+
#define FOUNDATION_EXPORT extern
|
9
|
+
#endif
|
10
|
+
#endif
|
11
|
+
#endif
|
12
|
+
|
13
|
+
#{plugin_headers}
|
14
|
+
|
15
|
+
FOUNDATION_EXPORT double #{plugin_name}VersionNumber;
|
16
|
+
FOUNDATION_EXPORT const unsigned char #{plugin_name}VersionString[];
|
@@ -14,7 +14,7 @@ TODO: Add long description of the pod here.
|
|
14
14
|
|
15
15
|
s.ios.deployment_target = '10.0'
|
16
16
|
s.swift_versions = '5.0'
|
17
|
-
s.preserve_paths = 'plist/*.{plist}'
|
17
|
+
s.preserve_paths = ['plist/*.{plist}', 'Extensions/**/*']
|
18
18
|
|
19
19
|
s.subspec 'Source' do |cs|
|
20
20
|
cs.source_files = '#{plugin_name}/Classes/**/*.{h,m,swift}'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gonative-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hunaid Hassan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01
|
11
|
+
date: 2022-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-cli
|
@@ -190,14 +190,20 @@ files:
|
|
190
190
|
- lib/gonative/commands/android/create.rb
|
191
191
|
- lib/gonative/commands/base.rb
|
192
192
|
- lib/gonative/commands/ios/create.rb
|
193
|
+
- lib/gonative/commands/ios/embed_extensions.rb
|
194
|
+
- lib/gonative/commands/ios/extract_extensions.rb
|
193
195
|
- lib/gonative/commands/ios/publish.rb
|
196
|
+
- lib/gonative/commands/ios/set_bundle_id.rb
|
194
197
|
- lib/gonative/commands/version.rb
|
195
198
|
- lib/gonative/dsl/error_catchable.rb
|
196
199
|
- lib/gonative/dsl/serviceable.rb
|
197
200
|
- lib/gonative/plugins/android/create.rb
|
198
201
|
- lib/gonative/plugins/ios/build_framework.rb
|
199
202
|
- lib/gonative/plugins/ios/create.rb
|
203
|
+
- lib/gonative/plugins/ios/embed_extensions.rb
|
204
|
+
- lib/gonative/plugins/ios/extract_extensions.rb
|
200
205
|
- lib/gonative/plugins/ios/release.rb
|
206
|
+
- lib/gonative/plugins/ios/set_bundle_id.rb
|
201
207
|
- lib/gonative/plugins/ios/verify.rb
|
202
208
|
- lib/gonative/utils.rb
|
203
209
|
- lib/gonative/utils/content_evaluator.rb
|
@@ -205,6 +211,8 @@ files:
|
|
205
211
|
- lib/gonative/utils/template_inflator.rb
|
206
212
|
- lib/gonative/utils/ui.rb
|
207
213
|
- lib/gonative/version.rb
|
214
|
+
- templates/build/ios/PLUGIN_NAME-umbrella.h.tpl
|
215
|
+
- templates/build/ios/PLUGIN_NAME.modulemap.tpl
|
208
216
|
- templates/build/ios/Podfile.tpl
|
209
217
|
- templates/build/ios/create-framework.sh.tpl
|
210
218
|
- templates/plugins/android/build.gradle
|