@@ -396,23 +396,39 @@ class VersionSolver {
396
396
return null ; // when unsatisfied.isEmpty
397
397
}
398
398
399
- bool isDirectAndStable (String packageName) {
400
- final dep = _root.pubspec.dependencies[packageName];
401
- if (dep == null ) return false ; // not a direct dependency
402
- final constraint = dep.constraint;
403
- if (constraint is Version ) {
404
- return ! constraint.isPreRelease;
399
+ // Prereleases are allowed only if the dependency is transitive, or if
400
+ // the constraint explicitly allows prereleases.
401
+ bool shouldAllowPrereleases (String packageName) {
402
+ final workspaces = [_root, ..._root.workspaceChildren];
403
+ bool constraintContainsPrerelease (VersionConstraint ? constraint) {
404
+ if (constraint is Version ) {
405
+ return constraint.isPreRelease;
406
+ }
407
+ if (constraint is VersionRange ) {
408
+ return (constraint.min != null && constraint.min! .isPreRelease) ||
409
+ (constraint.max != null && constraint.max! .isPreRelease) ||
410
+ constraint.isAny;
411
+ }
412
+ return false ;
405
413
}
406
- if (constraint is VersionRange && constraint.min != null ) {
407
- return ! constraint.min! .isPreRelease;
414
+ var isDirectOrDev = false ;
415
+ for (final workspace in workspaces) {
416
+ final directDep = workspace.dependencies[packageName];
417
+ if (directDep != null && constraintContainsPrerelease (directDep.constraint)) {
418
+ return true ;
419
+ }
420
+ final devDep = workspace.devDependencies[packageName];
421
+ if (devDep != null && constraintContainsPrerelease (devDep.constraint)) {
422
+ return true ;
423
+ }
424
+ isDirectOrDev = isDirectOrDev || directDep != null || devDep != null ;
408
425
}
409
- return false ;
426
+ return ! isDirectOrDev ;
410
427
}
411
428
412
429
PackageId ? version;
413
430
try {
414
- // Prereleases are allowed only if not direct or not stable.
415
- final allowPrereleases = ! isDirectAndStable (package.name);
431
+ final allowPrereleases = shouldAllowPrereleases (package.name);
416
432
version = await _packageLister (
417
433
package,
418
434
).bestVersion (package.constraint, allowPrereleases: allowPrereleases);
0 commit comments