Skip to content

Commit 87bdb12

Browse files
authored
fix(dart_frog_cli): support workspace root pubspec_overrides.yaml (#1897)
1 parent a8b367d commit 87bdb12

File tree

3 files changed

+106
-15
lines changed

3 files changed

+106
-15
lines changed

bricks/dart_frog_prod_server/hooks/lib/src/create_external_packages_folder.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,17 @@ Future<List<String>> createExternalPackagesFolder({
6464
);
6565

6666
overrideResolutionInPubspecOverrides(buildDirectory.path);
67-
writePathDependencyOverrides(
67+
writeDependencyOverrides(
6868
projectDirectory: buildDirectory.path,
69-
pathDependencies: copiedExternalPathDependencies,
69+
overrides: {
70+
for (final externalDependency in copiedExternalPathDependencies)
71+
externalDependency.name: {
72+
'path': path.relative(
73+
externalDependency.path,
74+
from: buildDirectory.path,
75+
),
76+
},
77+
},
7078
);
7179

7280
return copiedExternalPathDependencies

bricks/dart_frog_prod_server/hooks/lib/src/disable_workspace_resolution.dart

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ VoidCallback disableWorkspaceResolution(
2828
}
2929

3030
try {
31-
overridePathDependenciesInPubspecOverrides(
31+
overrideDependenciesInPubspecOverrides(
3232
projectDirectory: projectDirectory,
3333
packageConfig: packageConfig,
3434
packageGraph: packageGraph,
35+
workspaceRoot: workspaceRoot,
3536
);
3637
} on Exception catch (e) {
3738
restoreWorkspaceResolution();
@@ -70,11 +71,12 @@ VoidCallback overrideResolutionInPubspecOverrides(String projectDirectory) {
7071
return () => pubspecOverridesFile.writeAsStringSync(contents);
7172
}
7273

73-
/// Add overrides for all path dependencies to `pubspec_overrides.yaml`
74-
void overridePathDependenciesInPubspecOverrides({
74+
/// Add overrides for all necessary dependencies to `pubspec_overrides.yaml`
75+
void overrideDependenciesInPubspecOverrides({
7576
required String projectDirectory,
7677
required PackageConfig packageConfig,
7778
required PackageGraph packageGraph,
79+
required String workspaceRoot,
7880
}) {
7981
final name = getPackageName(projectDirectory: projectDirectory);
8082
if (name == null) {
@@ -90,29 +92,45 @@ void overridePathDependenciesInPubspecOverrides({
9092
.where((p) => p.relativeRoot && productionDeps.contains(p.name))
9193
.map((p) => PathDependency(name: p.name, path: p.root.path));
9294

93-
writePathDependencyOverrides(
95+
final workspaceRootOverrides = getWorkspaceRootDependencyOverrides(
96+
workspaceRoot: workspaceRoot,
97+
);
98+
final productionOverrides = workspaceRootOverrides.entries.where(
99+
(e) => productionDeps.contains(e.key),
100+
);
101+
102+
final overrides = <String, dynamic>{
103+
for (final pathDependency in pathDependencies)
104+
pathDependency.name: {
105+
'path': path.relative(pathDependency.path, from: projectDirectory),
106+
},
107+
for (final override in productionOverrides)
108+
'${override.key}': override.value,
109+
};
110+
111+
writeDependencyOverrides(
94112
projectDirectory: projectDirectory,
95-
pathDependencies: pathDependencies,
113+
overrides: overrides,
96114
);
97115
}
98116

99-
void writePathDependencyOverrides({
117+
void writeDependencyOverrides({
100118
required String projectDirectory,
101-
required Iterable<PathDependency> pathDependencies,
119+
required Map<String, dynamic> overrides,
102120
}) {
103121
final pubspecOverridesFile = File(
104122
path.join(projectDirectory, 'pubspec_overrides.yaml'),
105123
);
106124
final contents = pubspecOverridesFile.readAsStringSync();
107-
final overrides = loadYaml(contents) as YamlMap;
125+
final pubspecOverrides = loadYaml(contents) as YamlMap;
108126
final editor = YamlEditor(contents);
109-
if (!overrides.containsKey('dependency_overrides')) {
127+
if (!pubspecOverrides.containsKey('dependency_overrides')) {
110128
editor.update(['dependency_overrides'], {});
111129
}
112-
for (final package in pathDependencies) {
130+
for (final override in overrides.entries) {
113131
editor.update(
114-
['dependency_overrides', package.name],
115-
{'path': path.relative(package.path, from: projectDirectory)},
132+
['dependency_overrides', override.key],
133+
override.value,
116134
);
117135
}
118136
pubspecOverridesFile.writeAsStringSync(editor.toString());
@@ -130,6 +148,21 @@ String? getPackageName({required String projectDirectory}) {
130148
return name;
131149
}
132150

151+
YamlMap getWorkspaceRootDependencyOverrides({required String workspaceRoot}) {
152+
final pubspecOverridesFile = File(
153+
path.join(workspaceRoot, 'pubspec_overrides.yaml'),
154+
);
155+
if (!pubspecOverridesFile.existsSync()) return YamlMap();
156+
157+
final pubspecOverrides = loadYaml(pubspecOverridesFile.readAsStringSync());
158+
if (pubspecOverrides is! YamlMap) return YamlMap();
159+
160+
final overrides = pubspecOverrides['dependency_overrides'];
161+
if (overrides is! YamlMap) return YamlMap();
162+
163+
return overrides;
164+
}
165+
133166
/// Build a complete list of dependencies (direct and transitive).
134167
Set<String> getProductionDependencies({
135168
required String packageName,

bricks/dart_frog_prod_server/hooks/test/src/disable_workspace_resolution_test.dart

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,17 @@ void main() {
4141
packageGraph = _MockPackageGraph();
4242

4343
when(() => context.logger).thenReturn(logger);
44-
when(() => packageGraph.roots).thenReturn([packageName]);
44+
when(() => packageGraph.roots).thenReturn([packageName, 'dart_frog']);
4545
when(() => packageGraph.packages).thenReturn(
4646
[
4747
const PackageGraphPackage(
4848
name: packageName,
49+
dependencies: ['dart_frog'],
50+
devDependencies: [],
51+
version: '1.0.0',
52+
),
53+
const PackageGraphPackage(
54+
name: 'dart_frog',
4955
dependencies: [],
5056
devDependencies: [],
5157
version: '1.0.0',
@@ -118,6 +124,50 @@ resolution: null
118124
),
119125
);
120126
});
127+
128+
group('when workspace root contains pubspec_overrides.yaml', () {
129+
const workspaceRootDartFrogOverride = '''
130+
dart_frog:
131+
git:
132+
url: https://github.com/dart-frog-dev/dart_frog
133+
path: packages/dart_frog''';
134+
const workspaceRootPubspecOverrides = '''
135+
dependency_overrides:
136+
$workspaceRootDartFrogOverride
137+
''';
138+
139+
setUp(() {
140+
File(
141+
path.join(rootDirectory.path, 'pubspec_overrides.yaml'),
142+
).writeAsStringSync(workspaceRootPubspecOverrides);
143+
});
144+
145+
test('adds root overrides', () {
146+
disableWorkspaceResolution(
147+
context,
148+
packageConfig: packageConfig,
149+
packageGraph: packageGraph,
150+
projectDirectory: projectDirectory.path,
151+
workspaceRoot: rootDirectory.path,
152+
exit: exitCalls.add,
153+
);
154+
final contents = projectDirectory.listSync();
155+
expect(contents, hasLength(2));
156+
final pubspecOverrides = contents.firstWhere(
157+
(p) => path.basename(p.path) == 'pubspec_overrides.yaml',
158+
) as File;
159+
expect(
160+
pubspecOverrides.readAsStringSync(),
161+
equals(
162+
'''
163+
$originalPubspecOverridesContent
164+
$workspaceRootDartFrogOverride
165+
resolution: null
166+
''',
167+
),
168+
);
169+
});
170+
});
121171
});
122172

123173
group('when unable to read pubspec_overrides', () {

0 commit comments

Comments
 (0)