fastlane 2.191.0 → 2.192.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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +92 -92
  3. data/fastlane/lib/assets/completions/completion.bash +4 -1
  4. data/fastlane/lib/assets/completions/completion.zsh +6 -5
  5. data/fastlane/lib/fastlane/actions/create_xcframework.rb +97 -17
  6. data/fastlane/lib/fastlane/actions/notarize.rb +77 -1
  7. data/fastlane/lib/fastlane/actions/push_git_tags.rb +1 -1
  8. data/fastlane/lib/fastlane/actions/zip.rb +3 -3
  9. data/fastlane/lib/fastlane/version.rb +1 -1
  10. data/fastlane/swift/Deliverfile.swift +1 -1
  11. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  12. data/fastlane/swift/Fastlane.swift +48 -10
  13. data/fastlane/swift/Gymfile.swift +1 -1
  14. data/fastlane/swift/GymfileProtocol.swift +1 -1
  15. data/fastlane/swift/Matchfile.swift +1 -1
  16. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  17. data/fastlane/swift/Precheckfile.swift +1 -1
  18. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  19. data/fastlane/swift/Scanfile.swift +1 -1
  20. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  21. data/fastlane/swift/Screengrabfile.swift +1 -1
  22. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  23. data/fastlane/swift/Snapshotfile.swift +1 -1
  24. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  25. data/fastlane/swift/formatting/Brewfile.lock.json +6 -6
  26. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +41 -0
  27. data/pilot/lib/pilot/build_manager.rb +0 -1
  28. data/produce/lib/produce/service.rb +1 -1
  29. data/spaceship/lib/spaceship/connect_api/api_client.rb +15 -1
  30. data/spaceship/lib/spaceship/connect_api/models/app.rb +2 -1
  31. data/spaceship/lib/spaceship/connect_api/testflight/.testflight.rb.swp +0 -0
  32. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +7 -5
  33. data/spaceship/lib/spaceship/connect_api/token.rb +2 -0
  34. data/supply/lib/supply/client.rb +38 -5
  35. data/supply/lib/supply/options.rb +7 -0
  36. metadata +35 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 191c5f2f91fe567ba6f0c35848e69c0b921480ef1f2076bd531b774b6773bada
4
- data.tar.gz: 6cf068574ea7ea72ac092791021fc78c2d1486d9e6f03772cc9564420e98a989
3
+ metadata.gz: f1c0c051ec3343adfcc8dcc927954b9fe5e76bf56d813be5d4f0823695dcb835
4
+ data.tar.gz: 328239727a6f80cca28a6524784cb2f4e1b39454f0c6f2e2cf036735c26f6811
5
5
  SHA512:
6
- metadata.gz: aacb03423627e0dc324915167515f0a4c8faebd6349c9a989320332baa668782f7dfbd0c20899e0905fcffc3d3ad3f8e254e05f75b30facff9744636b37c3c00
7
- data.tar.gz: fa30c4044f3e3dffa7b53ed4a48d9e6fa2805649538077e2134f41eeada06e9bc66f4821124a5e59fb29542727aa8df9b278660ae522fbab134bee4427c6bc13
6
+ metadata.gz: c430d54e72ceb927d096d02ac12578e196194405a6398768656ded1b0274d6fdb1988487d400b6c3e7434e02b82f372ac200959f524afaa9374d385a4ab00a46
7
+ data.tar.gz: 3800cfae6b4add96d08f98fa780c721d2444c4e81e1bf24e437e5e7e9f455682b198a7bc63246738fd758da7f0437dfb311d410632b0d22faa4af0e58e7d0301
data/README.md CHANGED
@@ -35,11 +35,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
35
  <!-- This table is regenerated and resorted on each release -->
36
36
  <table id='team'>
37
37
  <tr>
38
- <td id='josh-holtz'>
39
- <a href='https://github.com/joshdholtz'>
40
- <img src='https://github.com/joshdholtz.png' width='140px;'>
38
+ <td id='stefan-natchev'>
39
+ <a href='https://github.com/snatchev'>
40
+ <img src='https://github.com/snatchev.png' width='140px;'>
41
41
  </a>
42
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
43
+ </td>
44
+ <td id='maksym-grebenets'>
45
+ <a href='https://github.com/mgrebenets'>
46
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
47
+ </a>
48
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
43
49
  </td>
44
50
  <td id='aaron-brager'>
45
51
  <a href='https://github.com/getaaron'>
@@ -47,69 +53,69 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
47
53
  </a>
48
54
  <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
49
55
  </td>
50
- <td id='daniel-jankowski'>
51
- <a href='https://github.com/mollyIV'>
52
- <img src='https://github.com/mollyIV.png' width='140px;'>
53
- </a>
54
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
55
- </td>
56
- <td id='luka-mirosevic'>
57
- <a href='https://github.com/lmirosevic'>
58
- <img src='https://github.com/lmirosevic.png' width='140px;'>
59
- </a>
60
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
61
- </td>
62
56
  <td id='satoshi-namai'>
63
57
  <a href='https://github.com/ainame'>
64
58
  <img src='https://github.com/ainame.png' width='140px;'>
65
59
  </a>
66
60
  <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
67
61
  </td>
62
+ <td id='jorge-revuelta-h'>
63
+ <a href='https://github.com/minuscorp'>
64
+ <img src='https://github.com/minuscorp.png' width='140px;'>
65
+ </a>
66
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
67
+ </td>
68
68
  </tr>
69
69
  <tr>
70
- <td id='max-ott'>
71
- <a href='https://github.com/max-ott'>
72
- <img src='https://github.com/max-ott.png' width='140px;'>
70
+ <td id='olivier-halligon'>
71
+ <a href='https://github.com/AliSoftware'>
72
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
73
73
  </a>
74
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
74
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
75
75
  </td>
76
- <td id='maksym-grebenets'>
77
- <a href='https://github.com/mgrebenets'>
78
- <img src='https://github.com/mgrebenets.png' width='140px;'>
76
+ <td id='manu-wallner'>
77
+ <a href='https://github.com/milch'>
78
+ <img src='https://github.com/milch.png' width='140px;'>
79
79
  </a>
80
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
80
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
81
81
  </td>
82
- <td id='felix-krause'>
83
- <a href='https://github.com/KrauseFx'>
84
- <img src='https://github.com/KrauseFx.png' width='140px;'>
82
+ <td id='joshua-liebowitz'>
83
+ <a href='https://github.com/taquitos'>
84
+ <img src='https://github.com/taquitos.png' width='140px;'>
85
85
  </a>
86
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
87
87
  </td>
88
- <td id='kohki-miki'>
89
- <a href='https://github.com/giginet'>
90
- <img src='https://github.com/giginet.png' width='140px;'>
88
+ <td id='luka-mirosevic'>
89
+ <a href='https://github.com/lmirosevic'>
90
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
91
91
  </a>
92
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
92
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
93
93
  </td>
94
- <td id='helmut-januschka'>
95
- <a href='https://github.com/hjanuschka'>
96
- <img src='https://github.com/hjanuschka.png' width='140px;'>
94
+ <td id='jan-piotrowski'>
95
+ <a href='https://github.com/janpio'>
96
+ <img src='https://github.com/janpio.png' width='140px;'>
97
97
  </a>
98
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
98
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
99
99
  </td>
100
100
  </tr>
101
101
  <tr>
102
- <td id='jimmy-dee'>
103
- <a href='https://github.com/jdee'>
104
- <img src='https://github.com/jdee.png' width='140px;'>
102
+ <td id='daniel-jankowski'>
103
+ <a href='https://github.com/mollyIV'>
104
+ <img src='https://github.com/mollyIV.png' width='140px;'>
105
105
  </a>
106
- <h4 align='center'>Jimmy Dee</h4>
106
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
107
107
  </td>
108
- <td id='roger-oba'>
109
- <a href='https://github.com/rogerluan'>
110
- <img src='https://github.com/rogerluan.png' width='140px;'>
108
+ <td id='helmut-januschka'>
109
+ <a href='https://github.com/hjanuschka'>
110
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
111
111
  </a>
112
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
113
+ </td>
114
+ <td id='jérôme-lacoste'>
115
+ <a href='https://github.com/lacostej'>
116
+ <img src='https://github.com/lacostej.png' width='140px;'>
117
+ </a>
118
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
113
119
  </td>
114
120
  <td id='matthew-ellis'>
115
121
  <a href='https://github.com/matthewellis'>
@@ -117,81 +123,75 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
117
123
  </a>
118
124
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
119
125
  </td>
120
- <td id='jorge-revuelta-h'>
121
- <a href='https://github.com/minuscorp'>
122
- <img src='https://github.com/minuscorp.png' width='140px;'>
123
- </a>
124
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
125
- </td>
126
- <td id='jan-piotrowski'>
127
- <a href='https://github.com/janpio'>
128
- <img src='https://github.com/janpio.png' width='140px;'>
126
+ <td id='fumiya-nakamura'>
127
+ <a href='https://github.com/nafu'>
128
+ <img src='https://github.com/nafu.png' width='140px;'>
129
129
  </a>
130
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
130
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
131
131
  </td>
132
132
  </tr>
133
133
  <tr>
134
- <td id='manish-rathi'>
135
- <a href='https://github.com/crazymanish'>
136
- <img src='https://github.com/crazymanish.png' width='140px;'>
137
- </a>
138
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
139
- </td>
140
134
  <td id='danielle-tomlinson'>
141
135
  <a href='https://github.com/endocrimes'>
142
136
  <img src='https://github.com/endocrimes.png' width='140px;'>
143
137
  </a>
144
138
  <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
145
139
  </td>
146
- <td id='joshua-liebowitz'>
147
- <a href='https://github.com/taquitos'>
148
- <img src='https://github.com/taquitos.png' width='140px;'>
140
+ <td id='roger-oba'>
141
+ <a href='https://github.com/rogerluan'>
142
+ <img src='https://github.com/rogerluan.png' width='140px;'>
149
143
  </a>
150
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
144
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
151
145
  </td>
152
- <td id='fumiya-nakamura'>
153
- <a href='https://github.com/nafu'>
154
- <img src='https://github.com/nafu.png' width='140px;'>
146
+ <td id='iulian-onofrei'>
147
+ <a href='https://github.com/revolter'>
148
+ <img src='https://github.com/revolter.png' width='140px;'>
155
149
  </a>
156
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
157
151
  </td>
158
- <td id='jérôme-lacoste'>
159
- <a href='https://github.com/lacostej'>
160
- <img src='https://github.com/lacostej.png' width='140px;'>
152
+ <td id='jimmy-dee'>
153
+ <a href='https://github.com/jdee'>
154
+ <img src='https://github.com/jdee.png' width='140px;'>
161
155
  </a>
162
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
156
+ <h4 align='center'>Jimmy Dee</h4>
157
+ </td>
158
+ <td id='felix-krause'>
159
+ <a href='https://github.com/KrauseFx'>
160
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
161
+ </a>
162
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
163
163
  </td>
164
164
  </tr>
165
165
  <tr>
166
- <td id='manu-wallner'>
167
- <a href='https://github.com/milch'>
168
- <img src='https://github.com/milch.png' width='140px;'>
166
+ <td id='max-ott'>
167
+ <a href='https://github.com/max-ott'>
168
+ <img src='https://github.com/max-ott.png' width='140px;'>
169
169
  </a>
170
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
170
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
171
171
  </td>
172
- <td id='andrew-mcburney'>
173
- <a href='https://github.com/armcburney'>
174
- <img src='https://github.com/armcburney.png' width='140px;'>
172
+ <td id='manish-rathi'>
173
+ <a href='https://github.com/crazymanish'>
174
+ <img src='https://github.com/crazymanish.png' width='140px;'>
175
175
  </a>
176
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
177
177
  </td>
178
- <td id='olivier-halligon'>
179
- <a href='https://github.com/AliSoftware'>
180
- <img src='https://github.com/AliSoftware.png' width='140px;'>
178
+ <td id='kohki-miki'>
179
+ <a href='https://github.com/giginet'>
180
+ <img src='https://github.com/giginet.png' width='140px;'>
181
181
  </a>
182
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
183
183
  </td>
184
- <td id='iulian-onofrei'>
185
- <a href='https://github.com/revolter'>
186
- <img src='https://github.com/revolter.png' width='140px;'>
184
+ <td id='andrew-mcburney'>
185
+ <a href='https://github.com/armcburney'>
186
+ <img src='https://github.com/armcburney.png' width='140px;'>
187
187
  </a>
188
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
188
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
189
189
  </td>
190
- <td id='stefan-natchev'>
191
- <a href='https://github.com/snatchev'>
192
- <img src='https://github.com/snatchev.png' width='140px;'>
190
+ <td id='josh-holtz'>
191
+ <a href='https://github.com/joshdholtz'>
192
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
193
193
  </a>
194
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
194
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  </table>
@@ -4,6 +4,7 @@ _fastlane_complete() {
4
4
  COMPREPLY=()
5
5
  local word="${COMP_WORDS[COMP_CWORD]}"
6
6
  local completions=""
7
+ local file
7
8
 
8
9
  # look for Fastfile either in this directory or fastlane/ then grab the lane names
9
10
  if [[ -e "Fastfile" ]]; then
@@ -12,10 +13,12 @@ _fastlane_complete() {
12
13
  file="fastlane/Fastfile"
13
14
  elif [[ -e ".fastlane/Fastfile" ]]; then
14
15
  file=".fastlane/Fastfile"
16
+ else
17
+ return 1
15
18
  fi
16
19
 
17
20
  # parse 'beta' out of 'lane :beta do', etc
18
- completions=$(grep "^\s*lane \:" $file | awk -F ':' '{print $2}' | awk -F ' ' '{print $1}')
21
+ completions="$(sed -En 's/^[ ]*lane +:([^ ]+).*$/\1/p' "$file")"
19
22
  completions="$completions update_fastlane"
20
23
 
21
24
  COMPREPLY=( $(compgen -W "$completions" -- "$word") )
@@ -1,7 +1,7 @@
1
1
  #!/bin/zsh
2
2
 
3
3
  _fastlane_complete() {
4
- local word completions
4
+ local word completions file
5
5
  word="$1"
6
6
 
7
7
  # look for Fastfile either in this directory or fastlane/ then grab the lane names
@@ -11,13 +11,14 @@ _fastlane_complete() {
11
11
  file="fastlane/Fastfile"
12
12
  elif [[ -e ".fastlane/Fastfile" ]] then
13
13
  file=".fastlane/Fastfile"
14
+ else
15
+ return 1
14
16
  fi
15
17
 
16
18
  # parse 'beta' out of 'lane :beta do', etc
17
- completions=`cat $file | grep "^\s*lane \:" | awk -F ':' '{print $2}' | awk -F ' ' '{print $1}'`
18
- completions="$completions
19
- update_fastlane"
19
+ completions="$(sed -En 's/^[ ]*lane +:([^ ]+).*$/\1/p' "$file")"
20
+ completions="$completions update_fastlane"
20
21
 
21
- reply=( "${(ps:\n:)completions}" )
22
+ reply=( "${=completions}" )
22
23
  }
23
24
 
@@ -5,12 +5,19 @@ module Fastlane
5
5
  end
6
6
 
7
7
  class CreateXcframeworkAction < Action
8
+ PARAMETERS_TO_OPTIONS = { headers: '-headers', dsyms: '-debug-symbols' }
9
+
8
10
  def self.run(params)
9
- UI.user_error!("Please provide either :frameworks or :libraries to be packaged into the xcframework") unless params[:frameworks] || params[:libraries]
11
+ artifacts = normalized_artifact_info(params[:frameworks], [:dsyms]) ||
12
+ normalized_artifact_info(params[:frameworks_with_dsyms], [:dsyms]) ||
13
+ normalized_artifact_info(params[:libraries], [:headers, :dsyms]) ||
14
+ normalized_artifact_info(params[:libraries_with_headers_or_dsyms], [:headers, :dsyms])
15
+
16
+ UI.user_error!("Please provide either :frameworks, :frameworks_with_dsyms, :libraries or :libraries_with_headers_or_dsyms to be packaged into the xcframework") unless artifacts
10
17
 
18
+ artifacts_type = params[:frameworks] || params[:frameworks_with_dsyms] ? '-framework' : '-library'
11
19
  create_command = ['xcodebuild', '-create-xcframework']
12
- create_command << params[:frameworks].map { |framework| ['-framework', "\"#{framework}\""] }.flatten if params[:frameworks]
13
- create_command << params[:libraries].map { |library, headers| ['-library', "\"#{library}\""] + (headers.empty? ? [] : ['-headers', "\"#{headers}\""]) } if params[:libraries]
20
+ create_command << artifacts.map { |artifact, artifact_info| [artifacts_type, "\"#{artifact}\""] + artifact_info_as_options(artifact_info) }.flatten
14
21
  create_command << ['-output', "\"#{params[:output]}\""]
15
22
  create_command << ['-allow-internal-distribution'] if params[:allow_internal_distribution]
16
23
 
@@ -24,6 +31,32 @@ module Fastlane
24
31
  sh(create_command)
25
32
  end
26
33
 
34
+ def self.normalized_artifact_info(artifacts_with_info, valid_info)
35
+ case artifacts_with_info
36
+ when Array
37
+ artifacts_with_info.map { |artifact| [artifact, {}] }.to_h
38
+ when Hash
39
+ # Convert keys of artifact info to symbols ('dsyms' to :dsyms) and only keep keys we are interested in
40
+ # For example with valid_info = [:dsyms]
41
+ # { 'FrameworkA.framework' => { 'dsyms' => 'FrameworkA.framework.dSYM', 'foo' => bar } }
42
+ # gets converted to
43
+ # { 'FrameworkA.framework' => { dsyms: 'FrameworkA.framework.dSYM' } }
44
+ artifacts_with_info.transform_values { |artifact_info| artifact_info.transform_keys(&:to_sym).slice(*valid_info) }
45
+ else
46
+ artifacts_with_info
47
+ end
48
+ end
49
+
50
+ def self.artifact_info_as_options(artifact_info)
51
+ artifact_info.map { |type, file| [PARAMETERS_TO_OPTIONS[type], "\"#{file}\""] }.flatten
52
+ end
53
+
54
+ def self.check_artifact_info(artifact_info)
55
+ UI.user_error!("Headers and dSYMs information should be a hash") unless artifact_info.kind_of?(Hash)
56
+ UI.user_error!("#{artifact_info[:headers]} doesn't exist or is not a directory") if artifact_info[:headers] && !File.directory?(artifact_info[:headers])
57
+ UI.user_error!("#{artifact_info[:dsyms]} doesn't seem to be a dSYM archive") if artifact_info[:dsyms] && !File.directory?(artifact_info[:dsyms])
58
+ end
59
+
27
60
  #####################################################
28
61
  # @!group Documentation
29
62
  #####################################################
@@ -37,13 +70,31 @@ module Fastlane
37
70
  Utility for packaging multiple build configurations of a given library
38
71
  or framework into a single xcframework.
39
72
 
40
- If you want to package several frameworks just provide an array containing
41
- the list of frameworks to be packaged using the :frameworks parameter.
73
+ If you want to package several frameworks just provide one of:
74
+
75
+ * An array containing the list of frameworks using the :frameworks parameter
76
+ (if they have no associated dSYMs):
77
+ ['FrameworkA.framework', 'FrameworkB.framework']
78
+
79
+ * A hash containing the list of frameworks with their dSYMs using the
80
+ :frameworks_with_dsyms parameter:
81
+ {
82
+ 'FrameworkA.framework' => {},
83
+ 'FrameworkB.framework' => { dsyms: 'FrameworkB.framework.dSYM' }
84
+ }
42
85
 
43
- If you want to package several libraries with their corresponding headers
44
- provide a hash containing the library as the key and the directory containing
45
- its headers as the value (or an empty string if there are no headers associated
46
- with the provided library).
86
+ If you want to package several libraries just provide one of:
87
+
88
+ * An array containing the list of libraries using the :libraries parameter
89
+ (if they have no associated headers or dSYMs):
90
+ ['LibraryA.so', 'LibraryB.so']
91
+
92
+ * A hash containing the list of libraries with their headers and dSYMs
93
+ using the :libraries_with_headers_or_dsyms parameter:
94
+ {
95
+ 'LibraryA.so' => { dsyms: 'libraryA.so.dSYM' },
96
+ 'LibraryB.so' => { headers: 'headers' }
97
+ }
47
98
 
48
99
  Finally specify the location of the xcframework to be generated using the :output
49
100
  parameter.
@@ -54,27 +105,54 @@ module Fastlane
54
105
  [
55
106
  FastlaneCore::ConfigItem.new(key: :frameworks,
56
107
  env_name: "FL_CREATE_XCFRAMEWORK_FRAMEWORKS",
57
- description: "Frameworks to add to the target xcframework",
108
+ description: "Frameworks (without dSYMs) to add to the target xcframework",
58
109
  type: Array,
59
110
  optional: true,
60
- conflicting_options: [:libraries],
111
+ conflicting_options: [:frameworks_with_dsyms, :libraries, :libraries_with_headers_or_dsyms],
61
112
  verify_block: proc do |value|
62
- value.each do |framework|
113
+ normalized_artifact_info(value, [:dsyms]).each do |framework, framework_info|
63
114
  UI.user_error!("#{framework} doesn't end with '.framework'. Is this really a framework?") unless framework.end_with?('.framework')
64
115
  UI.user_error!("Couldn't find framework at #{framework}") unless File.exist?(framework)
65
116
  UI.user_error!("#{framework} doesn't seem to be a framework") unless File.directory?(framework)
117
+ check_artifact_info(framework_info)
118
+ end
119
+ end),
120
+ FastlaneCore::ConfigItem.new(key: :frameworks_with_dsyms,
121
+ env_name: "FL_CREATE_XCFRAMEWORK_FRAMEWORKS_WITH_DSYMS",
122
+ description: "Frameworks (with dSYMs) to add to the target xcframework",
123
+ type: Hash,
124
+ optional: true,
125
+ conflicting_options: [:frameworks, :libraries, :libraries_with_headers_or_dsyms],
126
+ verify_block: proc do |value|
127
+ normalized_artifact_info(value, [:dsyms]).each do |framework, framework_info|
128
+ UI.user_error!("#{framework} doesn't end with '.framework'. Is this really a framework?") unless framework.end_with?('.framework')
129
+ UI.user_error!("Couldn't find framework at #{framework}") unless File.exist?(framework)
130
+ UI.user_error!("#{framework} doesn't seem to be a framework") unless File.directory?(framework)
131
+ check_artifact_info(framework_info)
66
132
  end
67
133
  end),
68
134
  FastlaneCore::ConfigItem.new(key: :libraries,
69
135
  env_name: "FL_CREATE_XCFRAMEWORK_LIBRARIES",
70
- description: "Libraries to add to the target xcframework, with their corresponding headers",
136
+ description: "Libraries (without headers or dSYMs) to add to the target xcframework",
137
+ type: Array,
138
+ optional: true,
139
+ conflicting_options: [:frameworks, :frameworks_with_dsyms, :libraries_with_headers_or_dsyms],
140
+ verify_block: proc do |value|
141
+ normalized_artifact_info(value, [:headers, :dsyms]).each do |library, library_info|
142
+ UI.user_error!("Couldn't find library at #{library}") unless File.exist?(library)
143
+ check_artifact_info(library_info)
144
+ end
145
+ end),
146
+ FastlaneCore::ConfigItem.new(key: :libraries_with_headers_or_dsyms,
147
+ env_name: "FL_CREATE_XCFRAMEWORK_LIBRARIES_WITH_HEADERS_OR_DSYMS",
148
+ description: "Libraries (with headers or dSYMs) to add to the target xcframework",
71
149
  type: Hash,
72
150
  optional: true,
73
- conflicting_options: [:frameworks],
151
+ conflicting_options: [:frameworks, :frameworks_with_dsyms, :libraries],
74
152
  verify_block: proc do |value|
75
- value.each do |library, headers|
153
+ normalized_artifact_info(value, [:headers, :dsyms]).each do |library, library_info|
76
154
  UI.user_error!("Couldn't find library at #{library}") unless File.exist?(library)
77
- UI.user_error!("#{headers} doesn't exist or is not a directory") unless headers.empty? || File.directory?(headers)
155
+ check_artifact_info(library_info)
78
156
  end
79
157
  end),
80
158
  FastlaneCore::ConfigItem.new(key: :output,
@@ -103,7 +181,9 @@ module Fastlane
103
181
  def self.example_code
104
182
  [
105
183
  "create_xcframework(frameworks: ['FrameworkA.framework', 'FrameworkB.framework'], output: 'UniversalFramework.xcframework')",
106
- "create_xcframework(libraries: { 'LibraryA.so' => '', 'LibraryB.so' => 'LibraryBHeaders'}, output: 'UniversalFramework.xcframework')"
184
+ "create_xcframework(frameworks_with_dsyms: {'FrameworkA.framework' => {}, 'FrameworkB.framework' => { dsyms: 'FrameworkB.framework.dSYM' } }, output: 'UniversalFramework.xcframework')",
185
+ "create_xcframework(libraries: ['LibraryA.so', 'LibraryB.so'], output: 'UniversalFramework.xcframework')",
186
+ "create_xcframework(libraries_with_headers_or_dsyms: { 'LibraryA.so' => { dsyms: 'libraryA.so.dSYM' }, 'LibraryB.so' => { headers: 'LibraryBHeaders' } }, output: 'UniversalFramework.xcframework')"
107
187
  ]
108
188
  end
109
189