run method

  1. @override
Future<void> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<void> run() async {
  final cwd = Directory.current.path;
  final projectName = p.basename(cwd);

  for (final dir in [
    'src/server',
    'src/client',
    'src/shared',
    'out/include',
  ]) {
    Directory(p.join(cwd, dir)).createSync(recursive: true);
  }

  File(p.join(cwd, 'default.project.json')).writeAsStringSync(
    '{\n'
    '  "name": "$projectName",\n'
    '  "tree": {\n'
    '    "\$className": "DataModel",\n'
    '    "ServerScriptService": {\n'
    '      "\$className": "ServerScriptService",\n'
    '      "\$path": "out/server"\n'
    '    },\n'
    '    "StarterPlayer": {\n'
    '      "\$className": "StarterPlayer",\n'
    '      "StarterPlayerScripts": {\n'
    '        "\$className": "StarterPlayerScripts",\n'
    '        "\$path": "out/client"\n'
    '      }\n'
    '    },\n'
    '    "ReplicatedStorage": {\n'
    '      "\$className": "ReplicatedStorage",\n'
    '      "shared": { "\$path": "out/shared" },\n'
    '      "include": { "\$path": "out/include" }\n'
    '    }\n'
    '  }\n'
    '}\n',
  );

  final info = _getRobloxDartInfo();
  final robloxDartPath = info['path'];
  final robloxDartVersion = info['version'];
  final usePathDependency = !_isPubCachePath(robloxDartPath!);

  File(p.join(cwd, 'pubspec.yaml')).writeAsStringSync(
    'name: $projectName\n'
    'description: A Roblox game built with roblox-dart\n'
    'publish_to: none\n'
    'version: 1.0.0\n'
    'environment:\n'
    '  sdk: ^3.0.0\n'
    'dependencies:\n'
    '  roblox_dart: ${usePathDependency ? '\n    path: $robloxDartPath' : '^$robloxDartVersion'}\n',
  );

  File(p.join(cwd, '.gitignore')).writeAsStringSync(
    'out/\n'
    '.dart_tool/\n'
    'pubspec.lock\n',
  );

  File(p.join(cwd, 'src/shared/shared.dart')).writeAsStringSync(
    "String greet(String who) {\n"
    "  return 'Hello, \$who, from roblox-dart!';\n"
    "}\n",
  );

  File(p.join(cwd, 'src/server/main.server.dart')).writeAsStringSync(
    "import '../shared/shared.dart';\n"
    "\n"
    "void main() {\n"
    "  print(greet('server'));\n"
    "}\n",
  );

  File(p.join(cwd, 'src/client/main.client.dart')).writeAsStringSync(
    "import '../shared/shared.dart';\n"
    "\n"
    "void main() {\n"
    "  print(greet('client'));\n"
    "}\n",
  );

  print('Project "$projectName" created.');

  print('Running dart pub get...');
  final result = await Process.run(
      'dart',
      [
        'pub',
        'get',
      ],
      workingDirectory: cwd);
  if (result.exitCode != 0) {
    print('Warning: dart pub get failed:\n${result.stderr}');
  } else {
    print('Dependencies installed.');
  }

  print('Run "roblox-dart watch" to start compiling.');
}