fastlane-plugin-repack_ios 0.1.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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +50 -0
- data/lib/fastlane/plugin/repack_ios.rb +16 -0
- data/lib/fastlane/plugin/repack_ios/actions/repack_ios_action.rb +207 -0
- data/lib/fastlane/plugin/repack_ios/helper/repack_ios_helper.rb +109 -0
- data/lib/fastlane/plugin/repack_ios/version.rb +5 -0
- metadata +190 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 231bb054a4432cab544fb6325aa60b06dbe0fd67
|
4
|
+
data.tar.gz: d6ed18ebe8d990ec51c0d96cc9a956b81ce9ea72
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3f56acda3c50944b24fcea153ca4c451c11a0b945199808a74a89019503724d7fedc93d7cfa03973d574ea1ab3b7deb36ef9e892a6898962787a795d45ca911b
|
7
|
+
data.tar.gz: 14618a0c843e60bbe900528de952566a319f9718d48dac0d46490bbd73f841a92cbb1f0ea42bb39b5327737685110b1904fc8d290045d5c766a780e82d886ac2
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2019 Omer Duzyol <omer@duzyol.net>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# repack_ios plugin
|
2
|
+
|
3
|
+
[](https://rubygems.org/gems/fastlane-plugin-repack_ios)
|
4
|
+
|
5
|
+
## Getting Started
|
6
|
+
|
7
|
+
This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To get started with `fastlane-plugin-repack_ios`, add it to your project by running:
|
8
|
+
|
9
|
+
```bash
|
10
|
+
fastlane add_plugin repack_ios
|
11
|
+
```
|
12
|
+
|
13
|
+
## About repack_ios
|
14
|
+
|
15
|
+
This plugin allows you to repack your existing .ipa packages with new assets or non-executable resources without rebuilding the native code. It supports fastlane's *sigh* and *match* actions to automatically detect provisioning profiles and certificates for resigning the modified ipa package. Also internally uses Gym configuration arguments to detect build related parameters like output directory etc.
|
16
|
+
|
17
|
+
You can use this plugin to modify your react-native js bundle without re-compiling the entire XCode project from the beginning. It significantly reduces the compilation time, especially useful for CI/CD based processes and also for your test automation.
|
18
|
+
|
19
|
+
## Run tests for this plugin
|
20
|
+
|
21
|
+
To run both the tests, and code style validation, run
|
22
|
+
|
23
|
+
```
|
24
|
+
rake
|
25
|
+
```
|
26
|
+
|
27
|
+
To automatically fix many of the styling issues, use
|
28
|
+
```
|
29
|
+
rubocop -a
|
30
|
+
```
|
31
|
+
|
32
|
+
## Issues and Feedback
|
33
|
+
|
34
|
+
For any other issues and feedback about this plugin, please submit it to this repository.
|
35
|
+
|
36
|
+
## Troubleshooting
|
37
|
+
|
38
|
+
If you have trouble using plugins, check out the [Plugins Troubleshooting](https://docs.fastlane.tools/plugins/plugins-troubleshooting/) guide.
|
39
|
+
|
40
|
+
## Using _fastlane_ Plugins
|
41
|
+
|
42
|
+
For more information about how the `fastlane` plugin system works, check out the [Plugins documentation](https://docs.fastlane.tools/plugins/create-plugin/).
|
43
|
+
|
44
|
+
## About _fastlane_
|
45
|
+
|
46
|
+
_fastlane_ is the easiest way to automate beta deployments and releases for your iOS and Android apps. To learn more, check out [fastlane.tools](https://fastlane.tools).
|
47
|
+
|
48
|
+
## License
|
49
|
+
|
50
|
+
MIT © [omerduzyol](https://github.com/omerduzyol)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'fastlane/plugin/repack_ios/version'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
module RepackIos
|
5
|
+
# Return all .rb files inside the "actions" and "helper" directory
|
6
|
+
def self.all_classes
|
7
|
+
Dir[File.expand_path('**/{actions,helper}/*.rb', File.dirname(__FILE__))]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# By default we want to import all available actions and helpers
|
13
|
+
# A plugin can contain any number of actions and plugins
|
14
|
+
Fastlane::RepackIos.all_classes.each do |current|
|
15
|
+
require current
|
16
|
+
end
|
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'fastlane/action'
|
2
|
+
require_relative '../helper/repack_ios_helper'
|
3
|
+
|
4
|
+
module Fastlane
|
5
|
+
module Actions
|
6
|
+
module SharedValues
|
7
|
+
REPACK_IOS_IPA_ORIGINAL = :REPACK_IOS_IPA_ORIGINAL
|
8
|
+
end
|
9
|
+
|
10
|
+
class RepackIosAction < Action
|
11
|
+
def self.run(params)
|
12
|
+
UI.important("Repack iOS started! 📦")
|
13
|
+
|
14
|
+
UI.message("Parameter Contents Path: #{params[:contents]}")
|
15
|
+
UI.message("Parameter IPA Path: #{params[:ipa]}")
|
16
|
+
|
17
|
+
if params[:ipa].nil?
|
18
|
+
UI.important("Parameter ipa is empty, trying to resolve Gym configuration...")
|
19
|
+
|
20
|
+
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, {})
|
21
|
+
|
22
|
+
output_directory = Gym.config[:output_directory]
|
23
|
+
output_name = Gym.config[:output_name]
|
24
|
+
|
25
|
+
ipa_path = "#{File.join(output_directory, output_name)}.ipa"
|
26
|
+
|
27
|
+
UI.important("Parameter ipa resolved as '#{ipa_path}'")
|
28
|
+
|
29
|
+
UI.user_error!("Resolved ipa file: #{File.expand_path(ipa_path)} is not exists. Please provide ipa path.") unless File.exist?(ipa_path)
|
30
|
+
else
|
31
|
+
ipa_path = params[:ipa]
|
32
|
+
end
|
33
|
+
|
34
|
+
ipa_original_path = Helper::RepackIosHelper.unpack_and_repack(output_name, ipa_path, params[:contents])
|
35
|
+
|
36
|
+
UI.message("Preparing to sign the new package")
|
37
|
+
|
38
|
+
sigh_profile_type = Actions.lane_context[SharedValues::SIGH_PROFILE_TYPE]
|
39
|
+
|
40
|
+
unless sigh_profile_type.nil?
|
41
|
+
UI.important("Match type parameters obtained from sigh profile context!")
|
42
|
+
params[:match_type] = sigh_profile_type.sub!('-', '')
|
43
|
+
end
|
44
|
+
|
45
|
+
# check match_type is passed?
|
46
|
+
if !params[:match_type].nil?
|
47
|
+
match_type = params[:match_type]
|
48
|
+
|
49
|
+
UI.message("Parameter Match Type: #{params[:match_type]}")
|
50
|
+
|
51
|
+
provisioning_profile_key = "sigh_#{params[:app_identifier]}_#{match_type}_profile-path"
|
52
|
+
# check if match has been executed before for the given app_identifier?
|
53
|
+
if ENV[provisioning_profile_key].nil?
|
54
|
+
|
55
|
+
UI.message("Trying to match certificates with given type...")
|
56
|
+
|
57
|
+
other_action.match(
|
58
|
+
type: match_type,
|
59
|
+
readonly: true
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
# read the provisioning_profile from sigh
|
64
|
+
provisioning_profile = ENV[provisioning_profile_key]
|
65
|
+
|
66
|
+
# otherwise, check provisioning_profile is not passed?
|
67
|
+
elsif !params[:provisioning_profile].nil?
|
68
|
+
UI.message("Parameter Provisioning Profile: #{params[:provisioning_profile]}")
|
69
|
+
end
|
70
|
+
|
71
|
+
UI.message("Resolving signing identity from provisioning profile...")
|
72
|
+
|
73
|
+
signing_identity = Helper::RepackIosHelper.get_signing_identity_from_provision_profile(provisioning_profile)
|
74
|
+
|
75
|
+
use_app_entitlements = params[:entitlements].nil?
|
76
|
+
|
77
|
+
other_action.resign(
|
78
|
+
ipa: File.expand_path(ipa_path),
|
79
|
+
signing_identity: signing_identity,
|
80
|
+
provisioning_profile: provisioning_profile,
|
81
|
+
use_app_entitlements: use_app_entitlements,
|
82
|
+
entitlements: params[:entitlements],
|
83
|
+
version: params[:version],
|
84
|
+
display_name: params[:display_name],
|
85
|
+
short_version: params[:short_version],
|
86
|
+
bundle_version: params[:bundle_version],
|
87
|
+
bundle_id: params[:bundle_id]
|
88
|
+
)
|
89
|
+
|
90
|
+
UI.important("iOS Repack completed! 📦 Original ipa can be found at '#{File.expand_path(ipa_original_path)}'")
|
91
|
+
Actions.lane_context[SharedValues::REPACK_IOS_IPA_ORIGINAL] = File.expand_path(ipa_original_path)
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.description
|
95
|
+
"Enables your build pipeline to repack your pre-built ipa with new assets without rebuilding the native code."
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.authors
|
99
|
+
["Omer Duzyol", "Creaworks Labs"]
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.output
|
103
|
+
[
|
104
|
+
['REPACK_IOS_IPA_ORIGINAL', 'Contains the new path name for the original ipa file']
|
105
|
+
]
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.details
|
109
|
+
"This plugin allows you to repack your existing .ipa packages with new assets or non-executable resources without rebuilding the native code. It supports fastlane's sigh and match actions to automatically detect provisioning profiles and certificates for resigning the modified ipa package."
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.available_options
|
113
|
+
[
|
114
|
+
FastlaneCore::ConfigItem.new(key: :app_identifier,
|
115
|
+
short_option: "-a",
|
116
|
+
env_name: "FL_REPACK_IOS_APP_IDENTIFIER",
|
117
|
+
description: "The bundle identifier of your app",
|
118
|
+
optional: true,
|
119
|
+
code_gen_sensitive: true,
|
120
|
+
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier),
|
121
|
+
default_value_dynamic: true),
|
122
|
+
FastlaneCore::ConfigItem.new(key: :ipa,
|
123
|
+
short_option: "-i",
|
124
|
+
optional: true,
|
125
|
+
env_name: "FL_REPACK_IOS_IPA",
|
126
|
+
description: "Path to your original ipa file to modify",
|
127
|
+
code_gen_sensitive: true,
|
128
|
+
default_value: Dir["*.ipa"].sort_by { |x| File.mtime(x) }.last,
|
129
|
+
default_value_dynamic: true,
|
130
|
+
verify_block: proc do |value|
|
131
|
+
UI.user_error!("Could not find ipa file at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
132
|
+
UI.user_error!("'#{value}' doesn't seem to be an ipa file") unless value.end_with?(".ipa")
|
133
|
+
end),
|
134
|
+
FastlaneCore::ConfigItem.new(key: :entitlements,
|
135
|
+
env_name: "FL_REPACK_IOS_ENTITLEMENTS",
|
136
|
+
description: "Path to the entitlement file to use, e.g. `myApp/MyApp.entitlements`",
|
137
|
+
is_string: true,
|
138
|
+
optional: true),
|
139
|
+
FastlaneCore::ConfigItem.new(key: :display_name,
|
140
|
+
env_name: "FL_REPACK_IOS_NAME",
|
141
|
+
description: "Display name to force resigned ipa to use",
|
142
|
+
is_string: true,
|
143
|
+
optional: true),
|
144
|
+
FastlaneCore::ConfigItem.new(key: :version,
|
145
|
+
env_name: "FL_REPACK_IOS_VERSION",
|
146
|
+
description: "Version number to force resigned ipa to use. Updates both `CFBundleShortVersionString` and `CFBundleVersion` values in `Info.plist`. Applies for main app and all nested apps or extensions",
|
147
|
+
conflicting_options: [:short_version, :bundle_version],
|
148
|
+
is_string: true,
|
149
|
+
optional: true),
|
150
|
+
FastlaneCore::ConfigItem.new(key: :short_version,
|
151
|
+
env_name: "FL_REPACK_IOS_SHORT_VERSION",
|
152
|
+
description: "Short version string to force resigned ipa to use (`CFBundleShortVersionString`)",
|
153
|
+
conflicting_options: [:version],
|
154
|
+
is_string: true,
|
155
|
+
optional: true),
|
156
|
+
FastlaneCore::ConfigItem.new(key: :bundle_version,
|
157
|
+
env_name: "FL_REPACK_IOS_BUNDLE_VERSION",
|
158
|
+
description: "Bundle version to force resigned ipa to use (`CFBundleVersion`)",
|
159
|
+
conflicting_options: [:version],
|
160
|
+
is_string: true,
|
161
|
+
optional: true),
|
162
|
+
FastlaneCore::ConfigItem.new(key: :bundle_id,
|
163
|
+
env_name: "FL_REPACK_IOS_BUNDLE_ID",
|
164
|
+
description: "Set new bundle ID during resign (`CFBundleIdentifier`)",
|
165
|
+
is_string: true,
|
166
|
+
optional: true),
|
167
|
+
FastlaneCore::ConfigItem.new(key: :match_type,
|
168
|
+
env_name: "FL_REPACK_IOS_MATCH_TYPE",
|
169
|
+
description: "Define the profile type, can be #{Match.environments.join(', ')} . Optional if you use _sigh_ or _match_",
|
170
|
+
is_string: true,
|
171
|
+
short_option: "-y",
|
172
|
+
verify_block: proc do |value|
|
173
|
+
unless Match.environments.include?(value)
|
174
|
+
UI.user_error!("Unsupported environment #{value}, must be in #{Match.environments.join(', ')}")
|
175
|
+
end
|
176
|
+
end),
|
177
|
+
FastlaneCore::ConfigItem.new(key: :provisioning_profile,
|
178
|
+
env_name: "FL_REPACK_IOS_PROVISIONING_PROFILE",
|
179
|
+
description: "Path to your provisioning_profile. Optional if you use _sigh_ or _match_",
|
180
|
+
default_value: Actions.lane_context[SharedValues::SIGH_PROFILE_PATH],
|
181
|
+
default_value_dynamic: true,
|
182
|
+
is_string: false,
|
183
|
+
verify_block: proc do |value|
|
184
|
+
files = case value
|
185
|
+
when Hash then value.values
|
186
|
+
when Enumerable then value
|
187
|
+
else [value]
|
188
|
+
end
|
189
|
+
files.each do |file|
|
190
|
+
UI.user_error!("Couldn't find provisiong profile at path '#{file}'") unless File.exist?(file)
|
191
|
+
end
|
192
|
+
end),
|
193
|
+
FastlaneCore::ConfigItem.new(key: :contents,
|
194
|
+
env_name: "FL_REPACK_IOS_CONTENTS", # The name of the environment variable
|
195
|
+
description: "Path for the new contents", # a short description of this parameter
|
196
|
+
verify_block: proc do |value|
|
197
|
+
UI.user_error!("No path argument found for the new contents, pass using `contents: 'path-to-new-contents-folder'`") unless value && !value.empty?
|
198
|
+
end)
|
199
|
+
]
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.is_supported?(platform)
|
203
|
+
platform == :ios
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'fastlane_core/ui/ui'
|
2
|
+
require 'zip'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Fastlane
|
6
|
+
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
7
|
+
|
8
|
+
module Helper
|
9
|
+
class ZipFileGenerator
|
10
|
+
# Initialize with the directory to zip and the location of the output archive.
|
11
|
+
def initialize(input_dir, output_file)
|
12
|
+
@input_dir = input_dir
|
13
|
+
@output_file = output_file
|
14
|
+
end
|
15
|
+
|
16
|
+
# Zip the input directory.
|
17
|
+
def write
|
18
|
+
entries = Dir.entries(@input_dir) - %w[. ..]
|
19
|
+
|
20
|
+
::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile|
|
21
|
+
write_entries(entries, '', zipfile)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# A helper method to make the recursion work.
|
28
|
+
def write_entries(entries, path, zipfile)
|
29
|
+
entries.each do |e|
|
30
|
+
zipfile_path = path == '' ? e : File.join(path, e)
|
31
|
+
disk_file_path = File.join(@input_dir, zipfile_path)
|
32
|
+
|
33
|
+
if File.directory?(disk_file_path)
|
34
|
+
recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
|
35
|
+
else
|
36
|
+
put_into_archive(disk_file_path, zipfile, zipfile_path)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
|
42
|
+
zipfile.mkdir(zipfile_path)
|
43
|
+
subdir = Dir.entries(disk_file_path) - %w[. ..]
|
44
|
+
write_entries(subdir, zipfile_path, zipfile)
|
45
|
+
end
|
46
|
+
|
47
|
+
def put_into_archive(disk_file_path, zipfile, zipfile_path)
|
48
|
+
zipfile.add(zipfile_path, disk_file_path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class RepackIosHelper
|
53
|
+
def self.get_signing_identity_from_provision_profile(provisioning_profile)
|
54
|
+
parsed_provision = FastlaneCore::ProvisioningProfile.parse(provisioning_profile)
|
55
|
+
|
56
|
+
cert = OpenSSL::X509::Certificate.new(parsed_provision["DeveloperCertificates"].first.string)
|
57
|
+
|
58
|
+
cert_info = cert.subject.to_s.gsub(/\s*subject=\s*/, "").tr("/", "\n")
|
59
|
+
out_array = cert_info.split("\n")
|
60
|
+
|
61
|
+
cert_info_map = out_array.each_with_object({}) do |str, h|
|
62
|
+
k, v = str.split("=")
|
63
|
+
h[k] = v
|
64
|
+
end
|
65
|
+
|
66
|
+
return cert_info_map['CN']
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.patch_ipa_contents(src, dest, preserve = false, dereference_root = false)
|
70
|
+
FileUtils::Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent|
|
71
|
+
destent = FileUtils::Entry_.new(dest, ent.rel, false)
|
72
|
+
|
73
|
+
UI.important("Overriding file #{destent.path.sub!(File.dirname(dest), '<NEW-IPA>')}") unless !ent.file? || !File.exist?(destent.path)
|
74
|
+
ent.copy(destent.path)
|
75
|
+
end, proc do |ent|
|
76
|
+
destent = FileUtils::Entry_.new(dest, ent.rel, false)
|
77
|
+
ent.copy_metadata(destent.path) if preserve
|
78
|
+
end)
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.unpack_and_repack(output_name, ipa_path, contents)
|
82
|
+
ipa_original_path = File.join(File.dirname(ipa_path), "#{File.basename(ipa_path, '.ipa')}-original-#{Time.now.to_i}.ipa")
|
83
|
+
ipa_tmp_path = Dir.mktmpdir
|
84
|
+
begin
|
85
|
+
UI.message("Unpacking the ipa package...")
|
86
|
+
Zip::File.open(ipa_path) do |zipfile|
|
87
|
+
zipfile.each do |entry|
|
88
|
+
extraction_path = File.join(ipa_tmp_path, entry.name)
|
89
|
+
zipfile.extract(entry, extraction_path)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
ipa_new_payload_path = "#{ipa_tmp_path}/Payload/#{output_name}.app/"
|
94
|
+
|
95
|
+
UI.message("Re-generating the ipa package with new contents...")
|
96
|
+
patch_ipa_contents(contents, ipa_new_payload_path, true)
|
97
|
+
|
98
|
+
UI.message("Backing-up the original ipa package...")
|
99
|
+
File.rename(ipa_path, ipa_original_path)
|
100
|
+
|
101
|
+
ZipFileGenerator.new(ipa_tmp_path, ipa_path).write
|
102
|
+
ensure
|
103
|
+
FileUtils.rm_rf(ipa_tmp_path)
|
104
|
+
end
|
105
|
+
return ipa_original_path
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
metadata
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fastlane-plugin-repack_ios
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Omer Duzyol
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-11-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: zip
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec_junit_formatter
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.49.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.49.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-require_tools
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: fastlane
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 2.120.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 2.120.0
|
153
|
+
description:
|
154
|
+
email: omer@duzyol.net
|
155
|
+
executables: []
|
156
|
+
extensions: []
|
157
|
+
extra_rdoc_files: []
|
158
|
+
files:
|
159
|
+
- LICENSE
|
160
|
+
- README.md
|
161
|
+
- lib/fastlane/plugin/repack_ios.rb
|
162
|
+
- lib/fastlane/plugin/repack_ios/actions/repack_ios_action.rb
|
163
|
+
- lib/fastlane/plugin/repack_ios/helper/repack_ios_helper.rb
|
164
|
+
- lib/fastlane/plugin/repack_ios/version.rb
|
165
|
+
homepage: https://github.com/creaworks-labs/fastlane-plugin-repack-ios
|
166
|
+
licenses:
|
167
|
+
- MIT
|
168
|
+
metadata: {}
|
169
|
+
post_install_message:
|
170
|
+
rdoc_options: []
|
171
|
+
require_paths:
|
172
|
+
- lib
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '0'
|
178
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
requirements: []
|
184
|
+
rubyforge_project:
|
185
|
+
rubygems_version: 2.5.2.3
|
186
|
+
signing_key:
|
187
|
+
specification_version: 4
|
188
|
+
summary: Enables your build pipeline to repack your pre-built ipa with new assets
|
189
|
+
without rebuilding the native code.
|
190
|
+
test_files: []
|