mirror of
https://github.com/NixOS/nixpkgs.git
synced 2026-10-02 13:00:23 +00:00
88 lines
2.7 KiB
Diff
88 lines
2.7 KiB
Diff
diff --git a/bin/melos.dart b/bin/melos.dart
|
|
index 2476436..ee6adb0 100644
|
|
--- a/packages/melos/bin/melos.dart
|
|
+++ b/packages/melos/bin/melos.dart
|
|
@@ -1,11 +1,74 @@
|
|
import 'package:cli_launcher/cli_launcher.dart';
|
|
import 'package:melos/src/command_runner.dart';
|
|
+import 'dart:io';
|
|
+import 'package:yaml/yaml.dart';
|
|
+import 'package:path/path.dart' as path;
|
|
|
|
-Future<void> main(List<String> arguments) async => launchExecutable(
|
|
- arguments,
|
|
- LaunchConfig(
|
|
- name: ExecutableName('melos'),
|
|
- launchFromSelf: false,
|
|
- entrypoint: melosEntryPoint,
|
|
- ),
|
|
-);
|
|
+final ExecutableName executableName = ExecutableName('melos');
|
|
+
|
|
+// Substituted at build time to the package's install location in the
|
|
+// nix store (see preBuild in package.nix).
|
|
+const _globalPackageRoot = '__NIX_MELOS_PACKAGE_ROOT__';
|
|
+
|
|
+Future<void> main(List<String> arguments) async {
|
|
+ final localInstallation = _findLocalInstallation(Directory.current);
|
|
+
|
|
+ await melosEntryPoint(
|
|
+ arguments,
|
|
+ LaunchContext(
|
|
+ directory: Directory.current,
|
|
+ globalInstallation: ExecutableInstallation(
|
|
+ name: executableName,
|
|
+ isSelf: false,
|
|
+ packageRoot: Directory(_globalPackageRoot),
|
|
+ ),
|
|
+ localInstallation: localInstallation,
|
|
+ ),
|
|
+ );
|
|
+}
|
|
+
|
|
+// Stolen then simplified from https://github.com/blaugold/cli_launcher/blob/dcdf11c42b77ddc8e38e7e2445c8cff9b55658ec/lib/cli_launcher.dart#L249
|
|
+ExecutableInstallation? _findLocalInstallation(Directory start) {
|
|
+ if (path.equals(start.path, start.parent.path)) {
|
|
+ return null;
|
|
+ }
|
|
+
|
|
+ final pubspecFile = File(path.join(start.path, 'pubspec.yaml'));
|
|
+ if (pubspecFile.existsSync()) {
|
|
+ final pubspecString = pubspecFile.readAsStringSync();
|
|
+ String? name;
|
|
+ YamlMap? dependencies;
|
|
+ YamlMap? devDependencies;
|
|
+
|
|
+ try {
|
|
+ final pubspecYaml = loadYamlDocument(
|
|
+ pubspecString,
|
|
+ sourceUrl: pubspecFile.uri,
|
|
+ );
|
|
+ final pubspec = pubspecYaml.contents as YamlMap;
|
|
+ name = pubspec['name'] as String?;
|
|
+ dependencies = pubspec['dependencies'] as YamlMap?;
|
|
+ devDependencies = pubspec['dev_dependencies'] as YamlMap?;
|
|
+ } catch (error, stackTrace) {
|
|
+ throw StateError(
|
|
+ 'Could not parse pubspec.yaml at ${start.path}.\n$error\n$stackTrace',
|
|
+ );
|
|
+ }
|
|
+
|
|
+ final isSelf = name == executableName.package;
|
|
+
|
|
+ if (isSelf ||
|
|
+ (dependencies != null &&
|
|
+ dependencies.containsKey(executableName.package)) ||
|
|
+ (devDependencies != null &&
|
|
+ devDependencies.containsKey(executableName.package))) {
|
|
+ return ExecutableInstallation(
|
|
+ name: executableName,
|
|
+ isSelf: isSelf,
|
|
+ packageRoot: start,
|
|
+ );
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return _findLocalInstallation(start.parent);
|
|
+}
|