Skip to content

Commit 178749b

Browse files
authored
Closes flutter#163767. Closes flutter#163706. It just works after, but added more test cases.
1 parent dec3b1e commit 178749b

File tree

3 files changed

+178
-3
lines changed

3 files changed

+178
-3
lines changed

packages/flutter_tools/lib/src/flutter_plugins.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,8 @@ bool _writeFlutterPluginsList(
239239
final String? oldPluginsFileStringContent = _readFileContent(pluginsFile);
240240
bool pluginsChanged = true;
241241
if (oldPluginsFileStringContent != null) {
242-
Object? decodedJson;
243242
try {
244-
decodedJson = jsonDecode(oldPluginsFileStringContent);
243+
final Object? decodedJson = jsonDecode(oldPluginsFileStringContent);
245244
if (decodedJson is Map<String, Object?>) {
246245
final String jsonOfNewPluginsMap = jsonEncode(pluginsMap);
247246
final String jsonOfOldPluginsMap = jsonEncode(decodedJson[_kFlutterPluginsPluginListKey]);
@@ -1095,6 +1094,11 @@ void _createPlatformPluginSymlinks(
10951094
/// dependencies declared in `pubspec.yaml`.
10961095
///
10971096
/// Assumes `pub get` has been executed since last change to `pubspec.yaml`.
1097+
///
1098+
/// Unless explicitly specified, [determineDevDependencies] is disabled by
1099+
/// default; if set to `true`, plugins that are development-only dependencies
1100+
/// may be labeled or, depending on the platform, omitted from metadata or
1101+
/// platform-specific artifacts.
10981102
Future<void> refreshPluginsList(
10991103
FlutterProject project, {
11001104
bool iosPlatform = false,

packages/flutter_tools/test/general.shard/project_test.dart

Lines changed: 157 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ import '../src/fake_pub_deps.dart';
3131
import '../src/fakes.dart';
3232

3333
void main() {
34+
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
35+
// See https://github.com/flutter/flutter/issues/160257 for details.
36+
FeatureFlags enableExplicitPackageDependencies() {
37+
return TestFeatureFlags(isExplicitPackageDependenciesEnabled: true);
38+
}
39+
40+
FeatureFlags disableExplicitPackageDependencies() {
41+
// ignore: avoid_redundant_argument_values
42+
return TestFeatureFlags(isExplicitPackageDependenciesEnabled: false);
43+
}
44+
3445
// TODO(zanderso): remove once FlutterProject is fully refactored.
3546
// this is safe since no tests have expectations on the test logger.
3647
final BufferLogger logger = BufferLogger.test();
@@ -272,6 +283,107 @@ void main() {
272283
await project.regeneratePlatformSpecificTooling(releaseMode: false);
273284
expectExists(project.android.hostAppGradleRoot.childFile('local.properties'));
274285
});
286+
287+
testUsingContext(
288+
'--no-explicit-package-dependencies does not determine dev dependencies',
289+
() async {
290+
// Create a plugin.
291+
await aPluginProject(legacy: false);
292+
// Create a project that depends on that plugin.
293+
final FlutterProject project = await projectWithPluginDependency();
294+
// Don't bother with Android, we just want the manifest.
295+
project.directory.childDirectory('android').deleteSync(recursive: true);
296+
297+
await project.regeneratePlatformSpecificTooling(releaseMode: false);
298+
expect(
299+
project.flutterPluginsDependenciesFile.readAsStringSync(),
300+
isNot(contains('"dev_dependency":true')),
301+
);
302+
},
303+
overrides: <Type, Generator>{
304+
FeatureFlags: disableExplicitPackageDependencies,
305+
FileSystem: () => MemoryFileSystem.test(),
306+
ProcessManager: () => FakeProcessManager.any(),
307+
Pub: () => FakePubWithPrimedDeps(devDependencies: <String>{'my_plugin'}),
308+
FlutterProjectFactory:
309+
() => FlutterProjectFactory(logger: logger, fileSystem: globals.fs),
310+
},
311+
);
312+
313+
testUsingContext(
314+
'--explicit-package-dependencies determines dev dependencies',
315+
() async {
316+
// Create a plugin.
317+
await aPluginProject(legacy: false);
318+
// Create a project that depends on that plugin.
319+
final FlutterProject project = await projectWithPluginDependency();
320+
// Don't bother with Android, we just want the manifest.
321+
project.directory.childDirectory('android').deleteSync(recursive: true);
322+
323+
await project.regeneratePlatformSpecificTooling(releaseMode: false);
324+
expect(
325+
project.flutterPluginsDependenciesFile.readAsStringSync(),
326+
contains('"dev_dependency":true'),
327+
);
328+
},
329+
overrides: <Type, Generator>{
330+
FeatureFlags: enableExplicitPackageDependencies,
331+
FileSystem: () => MemoryFileSystem.test(),
332+
ProcessManager: () => FakeProcessManager.any(),
333+
Pub: () => FakePubWithPrimedDeps(devDependencies: <String>{'my_plugin'}),
334+
FlutterProjectFactory:
335+
() => FlutterProjectFactory(logger: logger, fileSystem: globals.fs),
336+
},
337+
);
338+
339+
testUsingContext(
340+
'--explicit-package-dependencies with releaseMode: false retains dev plugins',
341+
() async {
342+
// Create a plugin.
343+
await aPluginProject(includeAndroidMain: true, legacy: false);
344+
// Create a project that depends on that plugin.
345+
final FlutterProject project = await projectWithPluginDependency();
346+
347+
await project.regeneratePlatformSpecificTooling(releaseMode: false);
348+
expect(
349+
project.android.generatedPluginRegistrantFile.readAsStringSync(),
350+
contains('MyPlugin'),
351+
);
352+
},
353+
overrides: <Type, Generator>{
354+
FeatureFlags: enableExplicitPackageDependencies,
355+
FileSystem: () => MemoryFileSystem.test(),
356+
ProcessManager: () => FakeProcessManager.any(),
357+
Pub: () => FakePubWithPrimedDeps(devDependencies: <String>{'my_plugin'}),
358+
FlutterProjectFactory:
359+
() => FlutterProjectFactory(logger: logger, fileSystem: globals.fs),
360+
},
361+
);
362+
363+
testUsingContext(
364+
'--explicit-package-dependencies with releaseMode: true omits dev plugins',
365+
() async {
366+
// Create a plugin.
367+
await aPluginProject(includeAndroidMain: true, legacy: false);
368+
// Create a project that depends on that plugin.
369+
final FlutterProject project = await projectWithPluginDependency();
370+
371+
await project.regeneratePlatformSpecificTooling(releaseMode: true);
372+
expect(
373+
project.android.generatedPluginRegistrantFile.readAsStringSync(),
374+
isNot(contains('MyPlugin')),
375+
);
376+
},
377+
overrides: <Type, Generator>{
378+
FeatureFlags: enableExplicitPackageDependencies,
379+
FileSystem: () => MemoryFileSystem.test(),
380+
ProcessManager: () => FakeProcessManager.any(),
381+
Pub: () => FakePubWithPrimedDeps(devDependencies: <String>{'my_plugin'}),
382+
FlutterProjectFactory:
383+
() => FlutterProjectFactory(logger: logger, fileSystem: globals.fs),
384+
},
385+
);
386+
275387
testUsingContext(
276388
'injects plugins for macOS',
277389
() async {
@@ -1730,7 +1842,41 @@ Future<FlutterProject> someProject({
17301842
return FlutterProject.fromDirectory(directory);
17311843
}
17321844

1733-
Future<FlutterProject> aPluginProject({bool legacy = true}) async {
1845+
Future<FlutterProject> projectWithPluginDependency() async {
1846+
final Directory directory = globals.fs.directory('some_project');
1847+
directory.childDirectory('.dart_tool').childFile('package_config.json')
1848+
..createSync(recursive: true)
1849+
..writeAsStringSync('''
1850+
{
1851+
"configVersion": 2,
1852+
"packages": [
1853+
{
1854+
"name": "my_plugin",
1855+
"rootUri": "/plugin_project",
1856+
"packageUri": "lib/",
1857+
"languageVersion": "2.12"
1858+
}
1859+
]
1860+
}
1861+
''');
1862+
directory.childFile('pubspec.yaml')
1863+
..createSync(recursive: true)
1864+
..writeAsStringSync('''
1865+
name: app_name
1866+
flutter:
1867+
1868+
dependencies:
1869+
my_plugin:
1870+
sdk: flutter
1871+
''');
1872+
directory.childDirectory('ios').createSync(recursive: true);
1873+
final Directory androidDirectory = directory.childDirectory('android')
1874+
..createSync(recursive: true);
1875+
androidDirectory.childFile('AndroidManifest.xml').writeAsStringSync('<manifest></manifest>');
1876+
return FlutterProject.fromDirectory(directory);
1877+
}
1878+
1879+
Future<FlutterProject> aPluginProject({bool legacy = true, bool includeAndroidMain = false}) async {
17341880
final Directory directory = globals.fs.directory('plugin_project');
17351881
directory.childDirectory('ios').createSync(recursive: true);
17361882
directory.childDirectory('android').createSync(recursive: true);
@@ -1765,6 +1911,16 @@ flutter:
17651911
''';
17661912
}
17671913
directory.childFile('pubspec.yaml').writeAsStringSync(pluginPubSpec);
1914+
if (includeAndroidMain) {
1915+
directory
1916+
.childDirectory('android')
1917+
.childFile(globals.fs.path.join('src', 'main', 'java', 'com', 'example', 'MyPlugin.java'))
1918+
..createSync(recursive: true)
1919+
..writeAsStringSync('''
1920+
import io.flutter.embedding.engine.plugins.FlutterPlugin;
1921+
class MyPlugin extends FluttPlugin { /* ... */ }
1922+
''');
1923+
}
17681924
return FlutterProject.fromDirectory(directory);
17691925
}
17701926

packages/flutter_tools/test/host_cross_arch.shard/macos_content_validation_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:file_testing/file_testing.dart';
66
import 'package:flutter_tools/src/base/file_system.dart';
77
import 'package:flutter_tools/src/base/io.dart';
8+
import 'package:flutter_tools/src/features.dart';
89

910
import '../integration.shard/test_utils.dart';
1011
import '../src/common.dart';
@@ -14,6 +15,20 @@ void main() {
1415

1516
setUpAll(() {
1617
processManager.runSync(<String>[flutterBin, 'config', '--enable-macos-desktop']);
18+
19+
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
20+
// See https://github.com/flutter/flutter/issues/160257 for details.
21+
if (!explicitPackageDependencies.master.enabledByDefault) {
22+
processManager.runSync(<String>[flutterBin, 'config', '--explicit-package-dependencies']);
23+
}
24+
});
25+
26+
tearDownAll(() {
27+
// TODO(matanlurey): Remove after `explicit-package-dependencies` is enabled by default.
28+
// See https://github.com/flutter/flutter/issues/160257 for details.
29+
if (!explicitPackageDependencies.master.enabledByDefault) {
30+
processManager.runSync(<String>[flutterBin, 'config', '--no-explicit-package-dependencies']);
31+
}
1732
});
1833

1934
for (final String buildMode in <String>['Debug', 'Release']) {

0 commit comments

Comments
 (0)