Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
1c18cf3d
Unverified
Commit
1c18cf3d
authored
Dec 17, 2020
by
Jenn Magder
Committed by
GitHub
Dec 17, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move macOS Podfile logic into the tool (#72020)
parent
9ec1601c
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
209 additions
and
250 deletions
+209
-250
Podfile
dev/benchmarks/macrobenchmarks/macos/Podfile
+17
-56
plugin_lint_mac.dart
dev/devicelab/bin/tasks/plugin_lint_mac.dart
+23
-4
Podfile
dev/integration_tests/flutter_gallery/macos/Podfile
+17
-56
podhelper.rb
packages/flutter_tools/bin/podhelper.rb
+79
-17
context_runner.dart
packages/flutter_tools/lib/src/context_runner.dart
+0
-1
xcodeproj.dart
packages/flutter_tools/lib/src/ios/xcodeproj.dart
+0
-11
cocoapods.dart
packages/flutter_tools/lib/src/macos/cocoapods.dart
+37
-39
Podfile-macos
packages/flutter_tools/templates/cocoapods/Podfile-macos
+17
-56
build_macos_test.dart
..._tools/test/commands.shard/hermetic/build_macos_test.dart
+0
-1
cocoapods_test.dart
...lutter_tools/test/general.shard/macos/cocoapods_test.dart
+18
-5
build_ios_config_only_test.dart
...ls/test/integration.shard/build_ios_config_only_test.dart
+1
-4
No files found.
dev/benchmarks/macrobenchmarks/macos/Podfile
View file @
1c18cf3d
...
@@ -9,71 +9,32 @@ project 'Runner', {
...
@@ -9,71 +9,32 @@ project 'Runner', {
'Release'
=>
:release
,
'Release'
=>
:release
,
}
}
def
parse_KV_file
(
file
,
separator
=
'='
)
def
flutter_root
file_abs_path
=
File
.
expand_path
(
file
)
generated_xcode_build_settings_path
=
File
.
expand_path
(
File
.
join
(
'..'
,
'Flutter'
,
'ephemeral'
,
'Flutter-Generated.xcconfig'
),
__FILE__
)
if
!
File
.
exists?
file_abs_path
unless
File
.
exist?
(
generated_xcode_build_settings_path
)
r
eturn
[];
r
aise
"
#{
generated_xcode_build_settings_path
}
must exist. If you're running pod install manually, make sure
\"
flutter pub get
\"
is executed first"
end
end
pods_ary
=
[]
skip_line_start_symbols
=
[
"#"
,
"/"
]
File
.
foreach
(
file_abs_path
)
{
|
line
|
next
if
skip_line_start_symbols
.
any?
{
|
symbol
|
line
=~
/^\s*
#{
symbol
}
/
}
plugin
=
line
.
split
(
pattern
=
separator
)
if
plugin
.
length
==
2
podname
=
plugin
[
0
].
strip
()
path
=
plugin
[
1
].
strip
()
podpath
=
File
.
expand_path
(
"
#{
path
}
"
,
file_abs_path
)
pods_ary
.
push
({
:name
=>
podname
,
:path
=>
podpath
});
else
puts
"Invalid plugin specification:
#{
line
}
"
end
}
return
pods_ary
end
def
pubspec_supports_macos
(
file
)
File
.
foreach
(
generated_xcode_build_settings_path
)
do
|
line
|
file_abs_path
=
File
.
expand_path
(
file
)
matches
=
line
.
match
(
/FLUTTER_ROOT\=(.*)/
)
if
!
File
.
exists?
file_abs_path
return
matches
[
1
].
strip
if
matches
return
false
;
end
end
File
.
foreach
(
file_abs_path
)
{
|
line
|
raise
"FLUTTER_ROOT not found in
#{
generated_xcode_build_settings_path
}
. Try deleting Flutter-Generated.xcconfig, then run
\"
flutter pub get
\"
"
return
true
if
line
=~
/^\s*macos:/
}
return
false
end
end
require
File
.
expand_path
(
File
.
join
(
'packages'
,
'flutter_tools'
,
'bin'
,
'podhelper'
),
flutter_root
)
flutter_macos_podfile_setup
target
'Runner'
do
target
'Runner'
do
use_frameworks!
use_frameworks!
use_modular_headers!
use_modular_headers!
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
flutter_install_all_macos_pods
File
.
dirname
(
File
.
realpath
(
__FILE__
))
# referring to absolute paths on developers' machines.
end
ephemeral_dir
=
File
.
join
(
'Flutter'
,
'ephemeral'
)
symlink_dir
=
File
.
join
(
ephemeral_dir
,
'.symlinks'
)
symlink_plugins_dir
=
File
.
join
(
symlink_dir
,
'plugins'
)
system
(
"rm -rf
#{
symlink_dir
}
"
)
system
(
"mkdir -p
#{
symlink_plugins_dir
}
"
)
# Flutter Pods
post_install
do
|
installer
|
generated_xcconfig
=
parse_KV_file
(
File
.
join
(
ephemeral_dir
,
'Flutter-Generated.xcconfig'
))
installer
.
pods_project
.
targets
.
each
do
|
target
|
if
generated_xcconfig
.
empty?
flutter_additional_macos_build_settings
(
target
)
puts
"Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
end
end
generated_xcconfig
.
map
{
|
p
|
if
p
[
:name
]
==
'FLUTTER_FRAMEWORK_DIR'
symlink
=
File
.
join
(
symlink_dir
,
'flutter'
)
File
.
symlink
(
File
.
dirname
(
p
[
:path
]),
symlink
)
pod
'FlutterMacOS'
,
:path
=>
File
.
join
(
symlink
,
File
.
basename
(
p
[
:path
]))
end
}
# Plugin Pods
plugin_pods
=
parse_KV_file
(
'../.flutter-plugins'
)
plugin_pods
.
map
{
|
p
|
symlink
=
File
.
join
(
symlink_plugins_dir
,
p
[
:name
])
File
.
symlink
(
p
[
:path
],
symlink
)
if
pubspec_supports_macos
(
File
.
join
(
symlink
,
'pubspec.yaml'
))
pod
p
[
:name
],
:path
=>
File
.
join
(
symlink
,
'macos'
)
end
}
end
end
dev/devicelab/bin/tasks/plugin_lint_mac.dart
View file @
1c18cf3d
...
@@ -415,7 +415,7 @@ void _validateIosPodfile(String appPath) {
...
@@ -415,7 +415,7 @@ void _validateIosPodfile(String appPath) {
||
!
podfileLockOutput
.
contains
(
':path: ".symlinks/plugins/test_plugin_objc/ios"'
)
||
!
podfileLockOutput
.
contains
(
':path: ".symlinks/plugins/test_plugin_objc/ios"'
)
||
!
podfileLockOutput
.
contains
(
':path: ".symlinks/plugins/test_plugin_swift/ios"'
)
||
!
podfileLockOutput
.
contains
(
':path: ".symlinks/plugins/test_plugin_swift/ios"'
)
||
podfileLockOutput
.
contains
(
'url_launcher_macos'
))
{
||
podfileLockOutput
.
contains
(
'url_launcher_macos'
))
{
throw
TaskResult
.
failure
(
'Podfile.lock does not contain expected pods'
);
throw
TaskResult
.
failure
(
'
iOS
Podfile.lock does not contain expected pods'
);
}
}
checkDirectoryNotExists
(
path
.
join
(
checkDirectoryNotExists
(
path
.
join
(
...
@@ -445,6 +445,11 @@ void _validateIosPodfile(String appPath) {
...
@@ -445,6 +445,11 @@ void _validateIosPodfile(String appPath) {
'ios'
,
'ios'
,
));
));
checkDirectoryNotExists
(
path
.
join
(
pluginSymlinks
,
'url_launcher_macos'
,
));
checkDirectoryExists
(
path
.
join
(
checkDirectoryExists
(
path
.
join
(
pluginSymlinks
,
pluginSymlinks
,
'test_plugin_objc'
,
'test_plugin_objc'
,
...
@@ -463,12 +468,21 @@ void _validateMacOSPodfile(String appPath) {
...
@@ -463,12 +468,21 @@ void _validateMacOSPodfile(String appPath) {
final
File
podfileLockFile
=
File
(
path
.
join
(
appPath
,
'macos'
,
'Podfile.lock'
));
final
File
podfileLockFile
=
File
(
path
.
join
(
appPath
,
'macos'
,
'Podfile.lock'
));
final
String
podfileLockOutput
=
podfileLockFile
.
readAsStringSync
();
final
String
podfileLockOutput
=
podfileLockFile
.
readAsStringSync
();
if
(!
podfileLockOutput
.
contains
(
':path: Flutter/ephemeral
/.symlinks/flutter/darwin-x64-release
'
)
if
(!
podfileLockOutput
.
contains
(
':path: Flutter/ephemeral
\n
'
)
||
!
podfileLockOutput
.
contains
(
':path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos'
)
||
!
podfileLockOutput
.
contains
(
':path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos'
)
||
!
podfileLockOutput
.
contains
(
':path: Flutter/ephemeral/.symlinks/plugins/test_plugin_swift/macos'
))
{
||
!
podfileLockOutput
.
contains
(
':path: Flutter/ephemeral/.symlinks/plugins/test_plugin_swift/macos'
)
throw
TaskResult
.
failure
(
'Podfile.lock does not contain expected pods'
);
||
podfileLockOutput
.
contains
(
'url_launcher/'
))
{
throw
TaskResult
.
failure
(
'macOS Podfile.lock does not contain expected pods'
);
}
}
checkFileExists
(
path
.
join
(
appPath
,
'macos'
,
'Flutter'
,
'ephemeral'
,
'FlutterMacOS.podspec'
,
));
final
String
pluginSymlinks
=
path
.
join
(
final
String
pluginSymlinks
=
path
.
join
(
appPath
,
appPath
,
'macos'
,
'macos'
,
...
@@ -484,6 +498,11 @@ void _validateMacOSPodfile(String appPath) {
...
@@ -484,6 +498,11 @@ void _validateMacOSPodfile(String appPath) {
'macos'
,
'macos'
,
));
));
checkDirectoryNotExists
(
path
.
join
(
pluginSymlinks
,
'url_launcher'
,
));
checkDirectoryExists
(
path
.
join
(
checkDirectoryExists
(
path
.
join
(
pluginSymlinks
,
pluginSymlinks
,
'test_plugin_swift'
,
'test_plugin_swift'
,
...
...
dev/integration_tests/flutter_gallery/macos/Podfile
View file @
1c18cf3d
...
@@ -9,71 +9,32 @@ project 'Runner', {
...
@@ -9,71 +9,32 @@ project 'Runner', {
'Release'
=>
:release
,
'Release'
=>
:release
,
}
}
def
parse_KV_file
(
file
,
separator
=
'='
)
def
flutter_root
file_abs_path
=
File
.
expand_path
(
file
)
generated_xcode_build_settings_path
=
File
.
expand_path
(
File
.
join
(
'..'
,
'Flutter'
,
'ephemeral'
,
'Flutter-Generated.xcconfig'
),
__FILE__
)
if
!
File
.
exists?
file_abs_path
unless
File
.
exist?
(
generated_xcode_build_settings_path
)
r
eturn
[];
r
aise
"
#{
generated_xcode_build_settings_path
}
must exist. If you're running pod install manually, make sure
\"
flutter pub get
\"
is executed first"
end
end
pods_ary
=
[]
skip_line_start_symbols
=
[
"#"
,
"/"
]
File
.
foreach
(
file_abs_path
)
{
|
line
|
next
if
skip_line_start_symbols
.
any?
{
|
symbol
|
line
=~
/^\s*
#{
symbol
}
/
}
plugin
=
line
.
split
(
pattern
=
separator
)
if
plugin
.
length
==
2
podname
=
plugin
[
0
].
strip
()
path
=
plugin
[
1
].
strip
()
podpath
=
File
.
expand_path
(
"
#{
path
}
"
,
file_abs_path
)
pods_ary
.
push
({
:name
=>
podname
,
:path
=>
podpath
});
else
puts
"Invalid plugin specification:
#{
line
}
"
end
}
return
pods_ary
end
def
pubspec_supports_macos
(
file
)
File
.
foreach
(
generated_xcode_build_settings_path
)
do
|
line
|
file_abs_path
=
File
.
expand_path
(
file
)
matches
=
line
.
match
(
/FLUTTER_ROOT\=(.*)/
)
if
!
File
.
exists?
file_abs_path
return
matches
[
1
].
strip
if
matches
return
false
;
end
end
File
.
foreach
(
file_abs_path
)
{
|
line
|
raise
"FLUTTER_ROOT not found in
#{
generated_xcode_build_settings_path
}
. Try deleting Flutter-Generated.xcconfig, then run
\"
flutter pub get
\"
"
return
true
if
line
=~
/^\s*macos:/
}
return
false
end
end
require
File
.
expand_path
(
File
.
join
(
'packages'
,
'flutter_tools'
,
'bin'
,
'podhelper'
),
flutter_root
)
flutter_macos_podfile_setup
target
'Runner'
do
target
'Runner'
do
use_frameworks!
use_frameworks!
use_modular_headers!
use_modular_headers!
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
flutter_install_all_macos_pods
File
.
dirname
(
File
.
realpath
(
__FILE__
))
# referring to absolute paths on developers' machines.
end
ephemeral_dir
=
File
.
join
(
'Flutter'
,
'ephemeral'
)
symlink_dir
=
File
.
join
(
ephemeral_dir
,
'.symlinks'
)
symlink_plugins_dir
=
File
.
join
(
symlink_dir
,
'plugins'
)
system
(
"rm -rf
#{
symlink_dir
}
"
)
system
(
"mkdir -p
#{
symlink_plugins_dir
}
"
)
# Flutter Pods
post_install
do
|
installer
|
generated_xcconfig
=
parse_KV_file
(
File
.
join
(
ephemeral_dir
,
'Flutter-Generated.xcconfig'
))
installer
.
pods_project
.
targets
.
each
do
|
target
|
if
generated_xcconfig
.
empty?
flutter_additional_macos_build_settings
(
target
)
puts
"Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
end
end
generated_xcconfig
.
map
{
|
p
|
if
p
[
:name
]
==
'FLUTTER_FRAMEWORK_DIR'
symlink
=
File
.
join
(
symlink_dir
,
'flutter'
)
File
.
symlink
(
File
.
dirname
(
p
[
:path
]),
symlink
)
pod
'FlutterMacOS'
,
:path
=>
File
.
join
(
symlink
,
File
.
basename
(
p
[
:path
]))
end
}
# Plugin Pods
plugin_pods
=
parse_KV_file
(
'../.flutter-plugins'
)
plugin_pods
.
map
{
|
p
|
symlink
=
File
.
join
(
symlink_plugins_dir
,
p
[
:name
])
File
.
symlink
(
p
[
:path
],
symlink
)
if
pubspec_supports_macos
(
File
.
join
(
symlink
,
'pubspec.yaml'
))
pod
p
[
:name
],
:path
=>
File
.
join
(
symlink
,
'macos'
)
end
}
end
end
packages/flutter_tools/bin/podhelper.rb
View file @
1c18cf3d
...
@@ -17,6 +17,10 @@ require 'json'
...
@@ -17,6 +17,10 @@ require 'json'
def
flutter_ios_podfile_setup
def
flutter_ios_podfile_setup
end
end
# Same as flutter_ios_podfile_setup for macOS.
def
flutter_macos_podfile_setup
end
# Add iOS build settings to pod targets.
# Add iOS build settings to pod targets.
#
#
# @example
# @example
...
@@ -67,6 +71,24 @@ def flutter_additional_ios_build_settings(target)
...
@@ -67,6 +71,24 @@ def flutter_additional_ios_build_settings(target)
end
end
end
end
# Same as flutter_ios_podfile_setup for macOS.
def
flutter_additional_macos_build_settings
(
target
)
print
target
.
platform_name
return
unless
target
.
platform_name
==
:osx
# This podhelper script is at $FLUTTER_ROOT/packages/flutter_tools/bin.
# Add search paths from $FLUTTER_ROOT/bin/cache/artifacts/engine.
artifacts_dir
=
File
.
join
(
'..'
,
'..'
,
'..'
,
'..'
,
'bin'
,
'cache'
,
'artifacts'
,
'engine'
)
debug_framework_dir
=
File
.
expand_path
(
File
.
join
(
artifacts_dir
,
'darwin-x64'
),
__FILE__
)
release_framework_dir
=
File
.
expand_path
(
File
.
join
(
artifacts_dir
,
'darwin-x64-release'
),
__FILE__
)
target
.
build_configurations
.
each
do
|
build_configuration
|
# Profile can't be derived from the CocoaPods build configuration. Use release framework (for linking only).
configuration_engine_dir
=
build_configuration
.
type
==
:debug
?
debug_framework_dir
:
release_framework_dir
build_configuration
.
build_settings
[
'FRAMEWORK_SEARCH_PATHS'
]
=
"
\"
#{
configuration_engine_dir
}
\"
$(inherited)"
end
end
# Install pods needed to embed Flutter iOS engine and plugins.
# Install pods needed to embed Flutter iOS engine and plugins.
#
#
# @example
# @example
...
@@ -77,7 +99,13 @@ end
...
@@ -77,7 +99,13 @@ end
# Optional, defaults to the Podfile directory.
# Optional, defaults to the Podfile directory.
def
flutter_install_all_ios_pods
(
ios_application_path
=
nil
)
def
flutter_install_all_ios_pods
(
ios_application_path
=
nil
)
flutter_install_ios_engine_pod
(
ios_application_path
)
flutter_install_ios_engine_pod
(
ios_application_path
)
flutter_install_ios_plugin_pods
(
ios_application_path
)
flutter_install_plugin_pods
(
ios_application_path
,
'.symlinks'
,
'ios'
)
end
# Same as flutter_install_all_ios_pods for macOS.
def
flutter_install_all_macos_pods
(
macos_application_path
=
nil
)
flutter_install_macos_engine_pod
(
macos_application_path
)
flutter_install_plugin_pods
(
macos_application_path
,
File
.
join
(
'Flutter'
,
'ephemeral'
,
'.symlinks'
),
'macos'
)
end
end
# Install iOS Flutter engine pod.
# Install iOS Flutter engine pod.
...
@@ -125,30 +153,64 @@ def flutter_install_ios_engine_pod(ios_application_path = nil)
...
@@ -125,30 +153,64 @@ def flutter_install_ios_engine_pod(ios_application_path = nil)
pod
'Flutter'
,
:path
=>
'Flutter'
pod
'Flutter'
,
:path
=>
'Flutter'
end
end
# Install iOS Flutter plugin pods.
# Same as flutter_install_ios_engine_pod for macOS.
def
flutter_install_macos_engine_pod
(
mac_application_path
=
nil
)
# defined_in_file is set by CocoaPods and is a Pathname to the Podfile.
mac_application_path
||=
File
.
dirname
(
defined_in_file
.
realpath
)
if
self
.
respond_to?
(
:defined_in_file
)
raise
'Could not find macOS application path'
unless
mac_application_path
copied_podspec_path
=
File
.
expand_path
(
'FlutterMacOS.podspec'
,
File
.
join
(
mac_application_path
,
'Flutter'
,
'ephemeral'
))
# Generate a fake podspec to represent the FlutterMacOS framework.
# This is only necessary because plugin podspecs contain `s.dependency 'FlutterMacOS'`, and if this Podfile
# does not add a `pod 'FlutterMacOS'` CocoaPods will try to download it from the CoocaPods trunk.
File
.
open
(
copied_podspec_path
,
'w'
)
{
|
podspec
|
podspec
.
write
<<~
EOF
#
# NOTE: This podspec is NOT to be published. It is only used as a local source!
# This is a generated file; do not edit or check into version control.
#
Pod::Spec.new do |s|
s.name = 'FlutterMacOS'
s.version = '1.0.0'
s.summary = 'High-performance, high-fidelity mobile apps.'
s.homepage = 'https://flutter.io'
s.license = { :type => 'MIT' }
s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' }
s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }
s.osx.deployment_target = '10.11'
# Framework linking is handled by Flutter tooling, not CocoaPods.
# Add a placeholder to satisfy `s.dependency 'FlutterMacOS'` plugin podspecs.
s.vendored_frameworks = 'path/to/nothing'
end
EOF
}
# Keep pod path relative so it can be checked into Podfile.lock.
pod
'FlutterMacOS'
,
:path
=>
File
.
join
(
'Flutter'
,
'ephemeral'
)
end
# Install Flutter plugin pods.
#
#
# @example
# @param [String] application_path Path of the directory of the Flutter app.
# target 'Runner' do
# Optional, defaults to the Podfile directory.
# flutter_install_ios_plugin_pods
def
flutter_install_plugin_pods
(
application_path
=
nil
,
relative_symlink_dir
,
platform
)
# end
# @param [String] ios_application_path Path of the iOS directory of the Flutter app.
# Optional, defaults to the Podfile directory.
def
flutter_install_ios_plugin_pods
(
ios_application_path
=
nil
)
# defined_in_file is set by CocoaPods and is a Pathname to the Podfile.
# defined_in_file is set by CocoaPods and is a Pathname to the Podfile.
ios_
application_path
||=
File
.
dirname
(
defined_in_file
.
realpath
)
if
self
.
respond_to?
(
:defined_in_file
)
application_path
||=
File
.
dirname
(
defined_in_file
.
realpath
)
if
self
.
respond_to?
(
:defined_in_file
)
raise
'Could not find
iOS application path'
unless
ios_
application_path
raise
'Could not find
application path'
unless
application_path
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
# referring to absolute paths on developers' machines.
# referring to absolute paths on developers' machines.
symlink_dir
=
File
.
expand_path
(
'.symlinks'
,
ios_
application_path
)
symlink_dir
=
File
.
expand_path
(
relative_symlink_dir
,
application_path
)
system
(
'rm'
,
'-rf'
,
symlink_dir
)
# Avoid the complication of dependencies like FileUtils.
system
(
'rm'
,
'-rf'
,
symlink_dir
)
# Avoid the complication of dependencies like FileUtils.
symlink_plugins_dir
=
File
.
expand_path
(
'plugins'
,
symlink_dir
)
symlink_plugins_dir
=
File
.
expand_path
(
'plugins'
,
symlink_dir
)
system
(
'mkdir'
,
'-p'
,
symlink_plugins_dir
)
system
(
'mkdir'
,
'-p'
,
symlink_plugins_dir
)
plugins_file
=
File
.
join
(
ios_
application_path
,
'..'
,
'.flutter-plugins-dependencies'
)
plugins_file
=
File
.
join
(
application_path
,
'..'
,
'.flutter-plugins-dependencies'
)
plugin_pods
=
flutter_parse_plugins_file
(
plugins_file
)
plugin_pods
=
flutter_parse_plugins_file
(
plugins_file
,
platform
)
plugin_pods
.
each
do
|
plugin_hash
|
plugin_pods
.
each
do
|
plugin_hash
|
plugin_name
=
plugin_hash
[
'name'
]
plugin_name
=
plugin_hash
[
'name'
]
plugin_path
=
plugin_hash
[
'path'
]
plugin_path
=
plugin_hash
[
'path'
]
...
@@ -157,14 +219,14 @@ def flutter_install_ios_plugin_pods(ios_application_path = nil)
...
@@ -157,14 +219,14 @@ def flutter_install_ios_plugin_pods(ios_application_path = nil)
File
.
symlink
(
plugin_path
,
symlink
)
File
.
symlink
(
plugin_path
,
symlink
)
# Keep pod path relative so it can be checked into Podfile.lock.
# Keep pod path relative so it can be checked into Podfile.lock.
pod
plugin_name
,
:path
=>
File
.
join
(
'.symlinks'
,
'plugins'
,
plugin_name
,
'ios'
)
pod
plugin_name
,
:path
=>
File
.
join
(
relative_symlink_dir
,
'plugins'
,
plugin_name
,
platform
)
end
end
end
end
end
end
# .flutter-plugins-dependencies format documented at
# .flutter-plugins-dependencies format documented at
# https://flutter.dev/go/plugins-list-migration
# https://flutter.dev/go/plugins-list-migration
def
flutter_parse_plugins_file
(
file
)
def
flutter_parse_plugins_file
(
file
,
platform
)
file_path
=
File
.
expand_path
(
file
)
file_path
=
File
.
expand_path
(
file
)
return
[]
unless
File
.
exists?
file_path
return
[]
unless
File
.
exists?
file_path
...
@@ -174,5 +236,5 @@ def flutter_parse_plugins_file(file)
...
@@ -174,5 +236,5 @@ def flutter_parse_plugins_file(file)
# dependencies_hash.dig('plugins', 'ios') not available until Ruby 2.3
# dependencies_hash.dig('plugins', 'ios') not available until Ruby 2.3
return
[]
unless
dependencies_hash
.
has_key?
(
'plugins'
)
return
[]
unless
dependencies_hash
.
has_key?
(
'plugins'
)
return
[]
unless
dependencies_hash
[
'plugins'
].
has_key?
(
'ios'
)
return
[]
unless
dependencies_hash
[
'plugins'
].
has_key?
(
'ios'
)
dependencies_hash
[
'plugins'
][
'ios'
]
||
[]
dependencies_hash
[
'plugins'
][
platform
]
||
[]
end
end
packages/flutter_tools/lib/src/context_runner.dart
View file @
1c18cf3d
...
@@ -136,7 +136,6 @@ Future<T> runInContext<T>(
...
@@ -136,7 +136,6 @@ Future<T> runInContext<T>(
logger:
globals
.
logger
,
logger:
globals
.
logger
,
platform:
globals
.
platform
,
platform:
globals
.
platform
,
xcodeProjectInterpreter:
globals
.
xcodeProjectInterpreter
,
xcodeProjectInterpreter:
globals
.
xcodeProjectInterpreter
,
artifacts:
globals
.
artifacts
,
usage:
globals
.
flutterUsage
,
usage:
globals
.
flutterUsage
,
),
),
CocoaPodsValidator:
()
=>
CocoaPodsValidator
(
CocoaPodsValidator:
()
=>
CocoaPodsValidator
(
...
...
packages/flutter_tools/lib/src/ios/xcodeproj.dart
View file @
1c18cf3d
...
@@ -181,17 +181,6 @@ List<String> _xcodeBuildSettingsLines({
...
@@ -181,17 +181,6 @@ List<String> _xcodeBuildSettingsLines({
xcodeBuildSettings
.
add
(
'SYMROOT=
\
${SOURCE_ROOT}
/../
${getIosBuildDirectory()}
'
);
xcodeBuildSettings
.
add
(
'SYMROOT=
\
${SOURCE_ROOT}
/../
${getIosBuildDirectory()}
'
);
}
}
if
(!
project
.
isModule
&&
useMacOSConfig
)
{
// For module projects we do not want to write the FLUTTER_FRAMEWORK_DIR
// explicitly. Rather we rely on the xcode backend script and the Podfile
// logic to derive it from FLUTTER_ROOT and FLUTTER_BUILD_MODE.
// However, this is necessary for regular macOS projects using Cocoapods.
final
String
frameworkDir
=
flutterMacOSFrameworkDir
(
buildInfo
.
mode
,
globals
.
fs
,
globals
.
artifacts
);
xcodeBuildSettings
.
add
(
'FLUTTER_FRAMEWORK_DIR=
$frameworkDir
'
);
}
final
String
buildName
=
parsedBuildName
(
manifest:
project
.
manifest
,
buildInfo:
buildInfo
)
??
'1.0.0'
;
final
String
buildName
=
parsedBuildName
(
manifest:
project
.
manifest
,
buildInfo:
buildInfo
)
??
'1.0.0'
;
xcodeBuildSettings
.
add
(
'FLUTTER_BUILD_NAME=
$buildName
'
);
xcodeBuildSettings
.
add
(
'FLUTTER_BUILD_NAME=
$buildName
'
);
...
...
packages/flutter_tools/lib/src/macos/cocoapods.dart
View file @
1c18cf3d
...
@@ -6,7 +6,6 @@ import 'package:file/file.dart';
...
@@ -6,7 +6,6 @@ import 'package:file/file.dart';
import
'package:meta/meta.dart'
;
import
'package:meta/meta.dart'
;
import
'package:process/process.dart'
;
import
'package:process/process.dart'
;
import
'../artifacts.dart'
;
import
'../base/common.dart'
;
import
'../base/common.dart'
;
import
'../base/error_handling_io.dart'
;
import
'../base/error_handling_io.dart'
;
import
'../base/file_system.dart'
;
import
'../base/file_system.dart'
;
...
@@ -41,15 +40,18 @@ const String outOfDateFrameworksPodfileConsequence = '''
...
@@ -41,15 +40,18 @@ const String outOfDateFrameworksPodfileConsequence = '''
If
you
have
local
Podfile
edits
you
would
like
to
keep
,
see
https:
//github.com/flutter/flutter/issues/24641 for instructions.''';
If
you
have
local
Podfile
edits
you
would
like
to
keep
,
see
https:
//github.com/flutter/flutter/issues/24641 for instructions.''';
const
String
outOfDatePluginsPodfileConsequence
=
'''
const
String
outOfDatePluginsPodfileConsequence
=
'''
This can cause issues if your application depends on plugins that do not support iOS.
This can cause issues if your application depends on plugins that do not support iOS
or macOS
.
See https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms for details.
See https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms for details.
If you have local Podfile edits you would like to keep, see https://github.com/flutter/flutter/issues/45197 for instructions.'''
;
If you have local Podfile edits you would like to keep, see https://github.com/flutter/flutter/issues/45197 for instructions.'''
;
const
String
cocoaPodsInstallInstructions
=
'see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.'
;
const
String
cocoaPodsInstallInstructions
=
'see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.'
;
const
String
podfileMigrationInstructions
=
'''
const
String
podfile
Ios
MigrationInstructions
=
'''
rm ios/Podfile'''
;
rm ios/Podfile'''
;
const
String
podfileMacOSMigrationInstructions
=
'''
rm macos/Podfile'''
;
/// Result of evaluating the CocoaPods installation.
/// Result of evaluating the CocoaPods installation.
enum
CocoaPodsStatus
{
enum
CocoaPodsStatus
{
/// iOS plugins will not work, installation required.
/// iOS plugins will not work, installation required.
...
@@ -83,13 +85,11 @@ class CocoaPods {
...
@@ -83,13 +85,11 @@ class CocoaPods {
@required
XcodeProjectInterpreter
xcodeProjectInterpreter
,
@required
XcodeProjectInterpreter
xcodeProjectInterpreter
,
@required
Logger
logger
,
@required
Logger
logger
,
@required
Platform
platform
,
@required
Platform
platform
,
@required
Artifacts
artifacts
,
@required
Usage
usage
,
@required
Usage
usage
,
})
:
_fileSystem
=
fileSystem
,
})
:
_fileSystem
=
fileSystem
,
_processManager
=
processManager
,
_processManager
=
processManager
,
_xcodeProjectInterpreter
=
xcodeProjectInterpreter
,
_xcodeProjectInterpreter
=
xcodeProjectInterpreter
,
_logger
=
logger
,
_logger
=
logger
,
_artifacts
=
artifacts
,
_usage
=
usage
,
_usage
=
usage
,
_processUtils
=
ProcessUtils
(
processManager:
processManager
,
logger:
logger
),
_processUtils
=
ProcessUtils
(
processManager:
processManager
,
logger:
logger
),
_operatingSystemUtils
=
OperatingSystemUtils
(
_operatingSystemUtils
=
OperatingSystemUtils
(
...
@@ -105,7 +105,6 @@ class CocoaPods {
...
@@ -105,7 +105,6 @@ class CocoaPods {
final
OperatingSystemUtils
_operatingSystemUtils
;
final
OperatingSystemUtils
_operatingSystemUtils
;
final
XcodeProjectInterpreter
_xcodeProjectInterpreter
;
final
XcodeProjectInterpreter
_xcodeProjectInterpreter
;
final
Logger
_logger
;
final
Logger
_logger
;
final
Artifacts
_artifacts
;
final
Usage
_usage
;
final
Usage
_usage
;
Future
<
String
>
_versionText
;
Future
<
String
>
_versionText
;
...
@@ -314,10 +313,6 @@ class CocoaPods {
...
@@ -314,10 +313,6 @@ class CocoaPods {
<
String
>[
'pod'
,
'install'
,
'--verbose'
],
<
String
>[
'pod'
,
'install'
,
'--verbose'
],
workingDirectory:
_fileSystem
.
path
.
dirname
(
xcodeProject
.
podfile
.
path
),
workingDirectory:
_fileSystem
.
path
.
dirname
(
xcodeProject
.
podfile
.
path
),
environment:
<
String
,
String
>{
environment:
<
String
,
String
>{
// For macOS Podfile only.
if
(
xcodeProject
is
MacOSProject
)
'FLUTTER_FRAMEWORK_DIR'
:
flutterMacOSFrameworkDir
(
buildMode
,
_fileSystem
,
_artifacts
),
// See https://github.com/flutter/flutter/issues/10873.
// See https://github.com/flutter/flutter/issues/10873.
// CocoaPods analytics adds a lot of latency.
// CocoaPods analytics adds a lot of latency.
'COCOAPODS_DISABLE_STATS'
:
'true'
,
'COCOAPODS_DISABLE_STATS'
:
'true'
,
...
@@ -374,29 +369,28 @@ class CocoaPods {
...
@@ -374,29 +369,28 @@ class CocoaPods {
}
}
void
_warnIfPodfileOutOfDate
(
XcodeBasedProject
xcodeProject
)
{
void
_warnIfPodfileOutOfDate
(
XcodeBasedProject
xcodeProject
)
{
if
(
xcodeProject
is
!
IosProject
)
{
final
bool
isIos
=
xcodeProject
is
IosProject
;
return
;
if
(
isIos
)
{
}
// Previously, the Podfile created a symlink to the cached artifacts engine framework
// and installed the Flutter pod from that path. This could get out of sync with the copy
// Previously, the Podfile created a symlink to the cached artifacts engine framework
// of the Flutter engine that was copied to ios/Flutter by the xcode_backend script.
// and installed the Flutter pod from that path. This could get out of sync with the copy
// It was possible for the symlink to point to a Debug version of the engine when the
// of the Flutter engine that was copied to ios/Flutter by the xcode_backend script.
// Xcode build configuration was Release, which caused App Store submission rejections.
// It was possible for the symlink to point to a Debug version of the engine when the
//
// Xcode build configuration was Release, which caused App Store submission rejections.
// Warn the user if they are still symlinking to the framework.
//
final
Link
flutterSymlink
=
_fileSystem
.
link
(
_fileSystem
.
path
.
join
(
// Warn the user if they are still symlinking to the framework.
(
xcodeProject
as
IosProject
).
symlinks
.
path
,
final
Link
flutterSymlink
=
_fileSystem
.
link
(
_fileSystem
.
path
.
join
(
'flutter'
,
(
xcodeProject
as
IosProject
).
symlinks
.
path
,
));
'flutter'
,
if
(
flutterSymlink
.
existsSync
())
{
));
throwToolExit
(
if
(
flutterSymlink
.
existsSync
())
{
'Warning: Podfile is out of date
\n
'
throwToolExit
(
'
$outOfDateFrameworksPodfileConsequence
\n
'
'Warning: Podfile is out of date
\n
'
'To regenerate the Podfile, run:
\n
'
'
$outOfDateFrameworksPodfileConsequence
\n
'
'
$podfileIosMigrationInstructions
\n
'
,
'To regenerate the Podfile, run:
\n
'
);
'
$podfileMigrationInstructions
\n
'
,
return
;
);
}
return
;
}
}
// Most of the pod and plugin parsing logic was moved from the Podfile
// Most of the pod and plugin parsing logic was moved from the Podfile
// into the tool's podhelper.rb script. If the Podfile still references
// into the tool's podhelper.rb script. If the Podfile still references
...
@@ -404,12 +398,16 @@ class CocoaPods {
...
@@ -404,12 +398,16 @@ class CocoaPods {
// plugin_pods = parse_KV_file('../.flutter-plugins')
// plugin_pods = parse_KV_file('../.flutter-plugins')
if
(
xcodeProject
.
podfile
.
existsSync
()
&&
if
(
xcodeProject
.
podfile
.
existsSync
()
&&
xcodeProject
.
podfile
.
readAsStringSync
().
contains
(
'.flutter-plugins
\'
'
))
{
xcodeProject
.
podfile
.
readAsStringSync
().
contains
(
'.flutter-plugins
\'
'
))
{
throwToolExit
(
const
String
error
=
'Warning: Podfile is out of date
\n
'
'Warning: Podfile is out of date
\n
'
'
$outOfDatePluginsPodfileConsequence
\n
'
'
$outOfDatePluginsPodfileConsequence
\n
'
'To regenerate the Podfile, run:
\n
'
;
'To regenerate the Podfile, run:
\n
'
if
(
isIos
)
{
'
$podfileMigrationInstructions
\n
'
,
throwToolExit
(
'
$error
\n
$podfileIosMigrationInstructions
\n
'
);
);
}
else
{
// The old macOS Podfile will work until `.flutter-plugins` is removed.
// Warn instead of exit.
_logger
.
printError
(
'
$error
\n
$podfileMacOSMigrationInstructions
\n
'
,
emphasis:
true
);
}
}
}
}
}
}
}
packages/flutter_tools/templates/cocoapods/Podfile-macos
View file @
1c18cf3d
...
@@ -9,71 +9,32 @@ project 'Runner', {
...
@@ -9,71 +9,32 @@ project 'Runner', {
'Release' => :release,
'Release' => :release,
}
}
def
parse_KV_file(file, separator='=')
def
flutter_root
file_abs_path = File.expand_path(file
)
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__
)
if !File.exists? file_abs_path
unless File.exist?(generated_xcode_build_settings_path)
r
eturn [];
r
aise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
end
end
pods_ary = []
skip_line_start_symbols = ["#", "/"]
File.foreach(file_abs_path) { |line|
next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
plugin = line.split(pattern=separator)
if plugin.length == 2
podname = plugin[0].strip()
path = plugin[1].strip()
podpath = File.expand_path("#{path}", file_abs_path)
pods_ary.push({:name => podname, :path => podpath});
else
puts "Invalid plugin specification: #{line}"
end
}
return pods_ary
end
def pubspec_supports_macos(file)
File.foreach(generated_xcode_build_settings_path) do |line|
file_abs_path = File.expand_path(file)
matches = line.match(/FLUTTER_ROOT\=(.*)/)
if !File.exists? file_abs_path
return matches[1].strip if matches
return false;
end
end
File.foreach(file_abs_path) { |line|
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
return true if line =~ /^\s*macos:/
}
return false
end
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_macos_podfile_setup
target 'Runner' do
target 'Runner' do
use_frameworks!
use_frameworks!
use_modular_headers!
use_modular_headers!
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
# referring to absolute paths on developers' machines.
end
ephemeral_dir = File.join('Flutter', 'ephemeral')
symlink_dir = File.join(ephemeral_dir, '.symlinks')
symlink_plugins_dir = File.join(symlink_dir, 'plugins')
system("rm -rf #{symlink_dir}")
system("mkdir -p #{symlink_plugins_dir}")
# Flutter Pods
post_install do |installer|
generated_xcconfig = parse_KV_file(File.join(ephemeral_dir, 'Flutter-Generated.xcconfig'))
installer.pods_project.targets.each do |target|
if generated_xcconfig.empty?
flutter_additional_macos_build_settings(target)
puts "Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
end
end
generated_xcconfig.map { |p|
if p[:name] == 'FLUTTER_FRAMEWORK_DIR'
symlink = File.join(symlink_dir, 'flutter')
File.symlink(File.dirname(p[:path]), symlink)
pod 'FlutterMacOS', :path => File.join(symlink, File.basename(p[:path]))
end
}
# Plugin Pods
plugin_pods = parse_KV_file('../.flutter-plugins')
plugin_pods.map { |p|
symlink = File.join(symlink_plugins_dir, p[:name])
File.symlink(p[:path], symlink)
if pubspec_supports_macos(File.join(symlink, 'pubspec.yaml'))
pod p[:name], :path => File.join(symlink, 'macos')
end
}
end
end
packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart
View file @
1c18cf3d
...
@@ -260,7 +260,6 @@ void main() {
...
@@ -260,7 +260,6 @@ void main() {
'DART_OBFUSCATION=true'
,
'DART_OBFUSCATION=true'
,
'EXTRA_FRONT_END_OPTIONS=--enable-experiment%3Dnon-nullable'
,
'EXTRA_FRONT_END_OPTIONS=--enable-experiment%3Dnon-nullable'
,
'EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment%3Dnon-nullable'
,
'EXTRA_GEN_SNAPSHOT_OPTIONS=--enable-experiment%3Dnon-nullable'
,
'FLUTTER_FRAMEWORK_DIR=.'
,
'SPLIT_DEBUG_INFO=foo/'
,
'SPLIT_DEBUG_INFO=foo/'
,
'TRACK_WIDGET_CREATION=true'
,
'TRACK_WIDGET_CREATION=true'
,
'TREE_SHAKE_ICONS=true'
,
'TREE_SHAKE_ICONS=true'
,
...
...
packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
View file @
1c18cf3d
...
@@ -4,7 +4,6 @@
...
@@ -4,7 +4,6 @@
import
'package:file/file.dart'
;
import
'package:file/file.dart'
;
import
'package:file/memory.dart'
;
import
'package:file/memory.dart'
;
import
'package:flutter_tools/src/artifacts.dart'
;
import
'package:flutter_tools/src/base/common.dart'
;
import
'package:flutter_tools/src/base/common.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
...
@@ -76,7 +75,6 @@ void main() {
...
@@ -76,7 +75,6 @@ void main() {
processManager:
mockProcessManager
,
processManager:
mockProcessManager
,
logger:
logger
,
logger:
logger
,
platform:
FakePlatform
(
operatingSystem:
'macos'
),
platform:
FakePlatform
(
operatingSystem:
'macos'
),
artifacts:
Artifacts
.
test
(),
xcodeProjectInterpreter:
mockXcodeProjectInterpreter
,
xcodeProjectInterpreter:
mockXcodeProjectInterpreter
,
usage:
usage
,
usage:
usage
,
);
);
...
@@ -109,7 +107,7 @@ void main() {
...
@@ -109,7 +107,7 @@ void main() {
when
(
mockProcessManager
.
run
(
when
(
mockProcessManager
.
run
(
<
String
>[
'pod'
,
'install'
,
'--verbose'
],
<
String
>[
'pod'
,
'install'
,
'--verbose'
],
workingDirectory:
'project/macos'
,
workingDirectory:
'project/macos'
,
environment:
<
String
,
String
>{
'
FLUTTER_FRAMEWORK_DIR'
:
'.'
,
'
COCOAPODS_DISABLE_STATS'
:
'true'
,
'LANG'
:
'en_US.UTF-8'
},
environment:
<
String
,
String
>{
'COCOAPODS_DISABLE_STATS'
:
'true'
,
'LANG'
:
'en_US.UTF-8'
},
)).
thenAnswer
((
_
)
async
=>
exitsHappy
());
)).
thenAnswer
((
_
)
async
=>
exitsHappy
());
fileSystem
.
file
(
'.packages'
).
writeAsStringSync
(
'
\n
'
);
fileSystem
.
file
(
'.packages'
).
writeAsStringSync
(
'
\n
'
);
});
});
...
@@ -373,7 +371,7 @@ void main() {
...
@@ -373,7 +371,7 @@ void main() {
),
throwsToolExit
(
message:
'Podfile is out of date'
));
),
throwsToolExit
(
message:
'Podfile is out of date'
));
});
});
testWithoutContext
(
'exits if Podfile parses .flutter-plugins'
,
()
async
{
testWithoutContext
(
'exits if
iOS
Podfile parses .flutter-plugins'
,
()
async
{
pretendPodIsInstalled
();
pretendPodIsInstalled
();
fileSystem
.
file
(
fileSystem
.
path
.
join
(
'project'
,
'ios'
,
'Podfile'
))
fileSystem
.
file
(
fileSystem
.
path
.
join
(
'project'
,
'ios'
,
'Podfile'
))
...
@@ -386,6 +384,22 @@ void main() {
...
@@ -386,6 +384,22 @@ void main() {
),
throwsToolExit
(
message:
'Podfile is out of date'
));
),
throwsToolExit
(
message:
'Podfile is out of date'
));
});
});
testWithoutContext
(
'prints warning if macOS Podfile parses .flutter-plugins'
,
()
async
{
pretendPodIsInstalled
();
fileSystem
.
file
(
fileSystem
.
path
.
join
(
'project'
,
'macos'
,
'Podfile'
))
..
createSync
()
..
writeAsStringSync
(
'plugin_pods = parse_KV_file(
\'
../.flutter-plugins
\'
)'
);
await
cocoaPodsUnderTest
.
processPods
(
xcodeProject:
projectUnderTest
.
macos
,
buildMode:
BuildMode
.
debug
,
);
expect
(
logger
.
errorText
,
contains
(
'Warning: Podfile is out of date'
));
expect
(
logger
.
errorText
,
contains
(
'rm macos/Podfile'
));
});
testWithoutContext
(
'throws, if Podfile is missing.'
,
()
async
{
testWithoutContext
(
'throws, if Podfile is missing.'
,
()
async
{
pretendPodIsInstalled
();
pretendPodIsInstalled
();
try
{
try
{
...
@@ -588,7 +602,6 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
...
@@ -588,7 +602,6 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by
<
String
>[
'pod'
,
'install'
,
'--verbose'
],
<
String
>[
'pod'
,
'install'
,
'--verbose'
],
workingDirectory:
'project/macos'
,
workingDirectory:
'project/macos'
,
environment:
<
String
,
String
>{
environment:
<
String
,
String
>{
'FLUTTER_FRAMEWORK_DIR'
:
'.'
,
'COCOAPODS_DISABLE_STATS'
:
'true'
,
'COCOAPODS_DISABLE_STATS'
:
'true'
,
'LANG'
:
'en_US.UTF-8'
,
'LANG'
:
'en_US.UTF-8'
,
},
},
...
...
packages/flutter_tools/test/integration.shard/build_ios_config_only_test.dart
View file @
1c18cf3d
...
@@ -41,10 +41,7 @@ void main() {
...
@@ -41,10 +41,7 @@ void main() {
// Config is updated if command succeeded.
// Config is updated if command succeeded.
expect
(
generatedConfig
,
exists
);
expect
(
generatedConfig
,
exists
);
expect
(
generatedConfig
.
readAsStringSync
(),
allOf
(
expect
(
generatedConfig
.
readAsStringSync
(),
contains
(
'DART_OBFUSCATION=true'
));
contains
(
'DART_OBFUSCATION=true'
),
isNot
(
contains
(
'FLUTTER_FRAMEWORK_DIR'
)),
));
// file that only exists if app was fully built.
// file that only exists if app was fully built.
final
File
frameworkPlist
=
fileSystem
.
file
(
final
File
frameworkPlist
=
fileSystem
.
file
(
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment