fastlane 2.191.0 → 2.194.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 (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