fastlane 2.191.0 → 2.194.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +84 -84
  3. data/cert/lib/cert/options.rb +1 -1
  4. data/deliver/lib/deliver/options.rb +1 -1
  5. data/fastlane/lib/assets/completions/completion.bash +4 -1
  6. data/fastlane/lib/assets/completions/completion.zsh +6 -5
  7. data/fastlane/lib/fastlane/actions/.notarize.rb.swp +0 -0
  8. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/create_xcframework.rb +97 -17
  10. data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +1 -1
  11. data/fastlane/lib/fastlane/actions/gradle.rb +1 -1
  12. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/notarize.rb +97 -12
  14. data/fastlane/lib/fastlane/actions/push_git_tags.rb +1 -1
  15. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  16. data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/set_changelog.rb +1 -1
  18. data/fastlane/lib/fastlane/actions/slather.rb +6 -0
  19. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +1 -1
  20. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +3 -1
  21. data/fastlane/lib/fastlane/actions/zip.rb +5 -5
  22. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +11 -5
  23. data/fastlane/lib/fastlane/version.rb +1 -1
  24. data/fastlane/swift/Deliverfile.swift +1 -1
  25. data/fastlane/swift/DeliverfileProtocol.swift +2 -2
  26. data/fastlane/swift/Fastlane.swift +101 -43
  27. data/fastlane/swift/Gymfile.swift +1 -1
  28. data/fastlane/swift/GymfileProtocol.swift +1 -1
  29. data/fastlane/swift/Matchfile.swift +1 -1
  30. data/fastlane/swift/MatchfileProtocol.swift +3 -3
  31. data/fastlane/swift/Precheckfile.swift +1 -1
  32. data/fastlane/swift/PrecheckfileProtocol.swift +2 -2
  33. data/fastlane/swift/Scanfile.swift +1 -1
  34. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  35. data/fastlane/swift/Screengrabfile.swift +1 -1
  36. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  37. data/fastlane/swift/Snapshotfile.swift +1 -1
  38. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  39. data/fastlane/swift/formatting/Brewfile.lock.json +10 -10
  40. data/fastlane_core/lib/fastlane_core/build_watcher.rb +25 -6
  41. data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +5 -0
  42. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +41 -0
  43. data/match/lib/match/options.rb +2 -2
  44. data/match/lib/match/runner.rb +10 -9
  45. data/pilot/lib/pilot/build_manager.rb +14 -4
  46. data/pilot/lib/pilot/manager.rb +3 -1
  47. data/pilot/lib/pilot/options.rb +21 -2
  48. data/precheck/lib/precheck/options.rb +1 -1
  49. data/produce/lib/produce/service.rb +1 -1
  50. data/sigh/lib/assets/resign.sh +1 -1
  51. data/sigh/lib/sigh/options.rb +1 -1
  52. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +2 -1
  53. data/spaceship/lib/spaceship/connect_api/api_client.rb +15 -1
  54. data/spaceship/lib/spaceship/connect_api/models/app.rb +2 -1
  55. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +1 -1
  56. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -0
  57. data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +4 -0
  58. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +7 -5
  59. data/spaceship/lib/spaceship/connect_api/token.rb +2 -0
  60. data/supply/lib/supply/client.rb +38 -5
  61. data/supply/lib/supply/options.rb +7 -0
  62. data/supply/lib/supply/uploader.rb +9 -6
  63. 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: 89364e66ffaf19316585dfb22f851fbaea4f5c592942a06b90ac4e1301b6eac1
4
+ data.tar.gz: a968f9c694a148943ff821d8ece6dc7874558638f1b3ae80637bbcc12483e0fa
5
5
  SHA512:
6
- metadata.gz: aacb03423627e0dc324915167515f0a4c8faebd6349c9a989320332baa668782f7dfbd0c20899e0905fcffc3d3ad3f8e254e05f75b30facff9744636b37c3c00
7
- data.tar.gz: fa30c4044f3e3dffa7b53ed4a48d9e6fa2805649538077e2134f41eeada06e9bc66f4821124a5e59fb29542727aa8df9b278660ae522fbab134bee4427c6bc13
6
+ metadata.gz: 0200da5a0b1fc50d082ad63f87b62a80047041014c31a0f786dd5bb713c4e257c3e1d4e1be5e5a6bbf250db09a1ecd19cbbde83b1329a0179a06c584d03eab1e
7
+ data.tar.gz: '0692862a0ad1e6ae72c8c8e7e59473fc2d2871d252f891e22bb0353844dee71b47b44d2ef9c9541500c5e3458c1ce05cceb9ee89af7d3a672d752daf72c39108'
data/README.md CHANGED
@@ -35,17 +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='manu-wallner'>
39
+ <a href='https://github.com/milch'>
40
+ <img src='https://github.com/milch.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/acrooow'>Manu Wallner</a></h4>
43
43
  </td>
44
- <td id='aaron-brager'>
45
- <a href='https://github.com/getaaron'>
46
- <img src='https://github.com/getaaron.png' width='140px;'>
44
+ <td id='max-ott'>
45
+ <a href='https://github.com/max-ott'>
46
+ <img src='https://github.com/max-ott.png' width='140px;'>
47
47
  </a>
48
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
49
49
  </td>
50
50
  <td id='daniel-jankowski'>
51
51
  <a href='https://github.com/mollyIV'>
@@ -53,25 +53,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
53
53
  </a>
54
54
  <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
55
55
  </td>
56
- <td id='luka-mirosevic'>
57
- <a href='https://github.com/lmirosevic'>
58
- <img src='https://github.com/lmirosevic.png' width='140px;'>
56
+ <td id='josh-holtz'>
57
+ <a href='https://github.com/joshdholtz'>
58
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
59
59
  </a>
60
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
60
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
61
61
  </td>
62
- <td id='satoshi-namai'>
63
- <a href='https://github.com/ainame'>
64
- <img src='https://github.com/ainame.png' width='140px;'>
62
+ <td id='jimmy-dee'>
63
+ <a href='https://github.com/jdee'>
64
+ <img src='https://github.com/jdee.png' width='140px;'>
65
65
  </a>
66
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
66
+ <h4 align='center'>Jimmy Dee</h4>
67
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
+ </td>
76
+ <td id='andrew-mcburney'>
77
+ <a href='https://github.com/armcburney'>
78
+ <img src='https://github.com/armcburney.png' width='140px;'>
79
+ </a>
80
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
75
81
  </td>
76
82
  <td id='maksym-grebenets'>
77
83
  <a href='https://github.com/mgrebenets'>
@@ -79,37 +85,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
79
85
  </a>
80
86
  <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
81
87
  </td>
88
+ <td id='stefan-natchev'>
89
+ <a href='https://github.com/snatchev'>
90
+ <img src='https://github.com/snatchev.png' width='140px;'>
91
+ </a>
92
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
93
+ </td>
82
94
  <td id='felix-krause'>
83
95
  <a href='https://github.com/KrauseFx'>
84
96
  <img src='https://github.com/KrauseFx.png' width='140px;'>
85
97
  </a>
86
98
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
87
99
  </td>
88
- <td id='kohki-miki'>
89
- <a href='https://github.com/giginet'>
90
- <img src='https://github.com/giginet.png' width='140px;'>
91
- </a>
92
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
93
- </td>
100
+ </tr>
101
+ <tr>
94
102
  <td id='helmut-januschka'>
95
103
  <a href='https://github.com/hjanuschka'>
96
104
  <img src='https://github.com/hjanuschka.png' width='140px;'>
97
105
  </a>
98
106
  <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
99
107
  </td>
100
- </tr>
101
- <tr>
102
- <td id='jimmy-dee'>
103
- <a href='https://github.com/jdee'>
104
- <img src='https://github.com/jdee.png' width='140px;'>
108
+ <td id='iulian-onofrei'>
109
+ <a href='https://github.com/revolter'>
110
+ <img src='https://github.com/revolter.png' width='140px;'>
105
111
  </a>
106
- <h4 align='center'>Jimmy Dee</h4>
112
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
107
113
  </td>
108
- <td id='roger-oba'>
109
- <a href='https://github.com/rogerluan'>
110
- <img src='https://github.com/rogerluan.png' width='140px;'>
114
+ <td id='jan-piotrowski'>
115
+ <a href='https://github.com/janpio'>
116
+ <img src='https://github.com/janpio.png' width='140px;'>
111
117
  </a>
112
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
119
+ </td>
120
+ <td id='joshua-liebowitz'>
121
+ <a href='https://github.com/taquitos'>
122
+ <img src='https://github.com/taquitos.png' width='140px;'>
123
+ </a>
124
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
113
125
  </td>
114
126
  <td id='matthew-ellis'>
115
127
  <a href='https://github.com/matthewellis'>
@@ -117,25 +129,13 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
117
129
  </a>
118
130
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
119
131
  </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;'>
129
- </a>
130
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
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;'>
134
+ <td id='fumiya-nakamura'>
135
+ <a href='https://github.com/nafu'>
136
+ <img src='https://github.com/nafu.png' width='140px;'>
137
137
  </a>
138
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
138
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
139
139
  </td>
140
140
  <td id='danielle-tomlinson'>
141
141
  <a href='https://github.com/endocrimes'>
@@ -143,55 +143,55 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
143
143
  </a>
144
144
  <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
145
145
  </td>
146
- <td id='joshua-liebowitz'>
147
- <a href='https://github.com/taquitos'>
148
- <img src='https://github.com/taquitos.png' width='140px;'>
146
+ <td id='kohki-miki'>
147
+ <a href='https://github.com/giginet'>
148
+ <img src='https://github.com/giginet.png' width='140px;'>
149
149
  </a>
150
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
151
151
  </td>
152
- <td id='fumiya-nakamura'>
153
- <a href='https://github.com/nafu'>
154
- <img src='https://github.com/nafu.png' width='140px;'>
152
+ <td id='manish-rathi'>
153
+ <a href='https://github.com/crazymanish'>
154
+ <img src='https://github.com/crazymanish.png' width='140px;'>
155
155
  </a>
156
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
157
157
  </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;'>
158
+ <td id='jorge-revuelta-h'>
159
+ <a href='https://github.com/minuscorp'>
160
+ <img src='https://github.com/minuscorp.png' width='140px;'>
161
161
  </a>
162
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</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='roger-oba'>
167
+ <a href='https://github.com/rogerluan'>
168
+ <img src='https://github.com/rogerluan.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/rogerluan_'>Roger Oba</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='satoshi-namai'>
173
+ <a href='https://github.com/ainame'>
174
+ <img src='https://github.com/ainame.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/ainame'>Satoshi Namai</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='jérôme-lacoste'>
179
+ <a href='https://github.com/lacostej'>
180
+ <img src='https://github.com/lacostej.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/lacostej'>Jérôme Lacoste</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='aaron-brager'>
185
+ <a href='https://github.com/getaaron'>
186
+ <img src='https://github.com/getaaron.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/getaaron'>Aaron Brager</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='luka-mirosevic'>
191
+ <a href='https://github.com/lmirosevic'>
192
+ <img src='https://github.com/lmirosevic.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/lmirosevic'>Luka Mirosevic</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  </table>
@@ -47,7 +47,7 @@ module Cert
47
47
  end),
48
48
  FastlaneCore::ConfigItem.new(key: :api_key,
49
49
  env_names: ["CERT_API_KEY", "DELIVER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
50
- description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
50
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
51
51
  type: Hash,
52
52
  optional: true,
53
53
  sensitive: true,
@@ -22,7 +22,7 @@ module Deliver
22
22
  end),
23
23
  FastlaneCore::ConfigItem.new(key: :api_key,
24
24
  env_names: ["DELIVER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
25
- description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
25
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
26
26
  type: Hash,
27
27
  optional: true,
28
28
  sensitive: true,
@@ -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
 
@@ -125,7 +125,7 @@ module Fastlane
125
125
  end),
126
126
  FastlaneCore::ConfigItem.new(key: :api_key,
127
127
  env_names: ["APPSTORE_BUILD_NUMBER_API_KEY", "APP_STORE_CONNECT_API_KEY"],
128
- description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option)",
128
+ description: "Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-hash-option)",
129
129
  type: Hash,
130
130
  default_value: Fastlane::Actions.lane_context[Fastlane::Actions::SharedValues::APP_STORE_CONNECT_API_KEY],
131
131
  default_value_dynamic: true,
@@ -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