| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| library sky_tools.init; |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| |
| import 'package:args/args.dart'; |
| import 'package:mustache4dart/mustache4dart.dart' as mustache; |
| import 'package:path/path.dart' as p; |
| |
| import 'common.dart'; |
| |
| class InitCommandHandler extends CommandHandler { |
| InitCommandHandler() : super('init', 'Create a new sky project.'); |
| |
| ArgParser get parser { |
| // TODO: Add a --template option for template selection when we have more than one. |
| ArgParser parser = new ArgParser(); |
| parser.addFlag('help', |
| abbr: 'h', negatable: false, help: 'Display this help message.'); |
| parser.addOption('out', abbr: 'o', help: 'The output directory.'); |
| parser.addFlag('pub', defaultsTo: true, |
| help: 'Whether to run pub after the project has been created.'); |
| return parser; |
| } |
| |
| Future processArgResults(ArgResults results) async { |
| if (results['help']) { |
| printUsage(); |
| return new Future.value(); |
| } |
| |
| if (!results.wasParsed('out')) { |
| printUsage('No option specified for the output directory.'); |
| return new Future.value(); |
| } |
| |
| // TODO: Confirm overwrite of an existing directory with the user. |
| Directory out = new Directory(results['out']); |
| |
| new SkySimpleTemplate().generateInto(out); |
| |
| print(''); |
| |
| String message = 'All done! To run your application:\n' |
| 'cd ${out.path}\n' |
| './packages/sky/sky_tool start'; |
| |
| if (results['pub']) { |
| print("Running pub get..."); |
| Process process = await Process.start('pub', ['get'], workingDirectory: out.path); |
| stdout.addStream(process.stdout); |
| stderr.addStream(process.stderr); |
| int code = await process.exitCode; |
| if (code == 0) { |
| print('\n${message}'); |
| } |
| } else { |
| print(message); |
| } |
| } |
| } |
| |
| abstract class Template { |
| final String name; |
| final String description; |
| |
| Map<String, String> files = {}; |
| |
| Template(this.name, this.description); |
| |
| void generateInto(Directory dir) { |
| String projectName = _normalizeProjectName(p.basename(dir.path)); |
| print('Creating ${p.basename(projectName)}...'); |
| dir.createSync(recursive: true); |
| |
| files.forEach((String path, String contents) { |
| Map m = { |
| 'projectName': projectName, |
| 'description': description |
| }; |
| contents = mustache.render(contents, m); |
| File file = new File(p.join(dir.path, path)); |
| file.parent.createSync(); |
| file.writeAsStringSync(contents); |
| print(file.path); |
| }); |
| } |
| |
| String toString() => name; |
| } |
| |
| class SkySimpleTemplate extends Template { |
| SkySimpleTemplate() : super('sky-simple', 'A minimal Sky project.') { |
| files['.gitignore']= _gitignore; |
| files['pubspec.yaml']= _pubspec; |
| files['README.md']= _readme; |
| files['lib/main.dart']= _libMain; |
| } |
| } |
| |
| String _normalizeProjectName(String name) { |
| name = name.replaceAll('-', '_').replaceAll(' ', '_'); |
| // Strip any extension (like .dart). |
| if (name.contains('.')) { |
| name = name.substring(0, name.indexOf('.')); |
| } |
| return name; |
| } |
| |
| const _gitignore = r''' |
| .DS_Store |
| .idea |
| .packages |
| .pub/ |
| build/ |
| packages |
| pubspec.lock |
| '''; |
| |
| const _readme = r''' |
| # {{projectName}} |
| |
| {{description}} |
| |
| ## Getting Started |
| |
| For help getting started, view our online |
| [readme](https://github.com/domokit/sky_engine/blob/master/sky/packages/sky/README.md). |
| '''; |
| |
| const _pubspec = r''' |
| name: {{projectName}} |
| description: {{description}} |
| dependencies: |
| sky: any |
| sky_tools: any |
| '''; |
| |
| const _libMain = r''' |
| import 'package:sky/widgets.dart'; |
| |
| class HelloWorldApp extends App { |
| Widget build() { |
| return new Scaffold( |
| toolbar: new ToolBar(center: new Text("Demo")), |
| body: new Material(child: new Center(child: new Text("Hello world!"))), |
| floatingActionButton: new FloatingActionButton( |
| child: new Icon(type: 'content/add', size: 24))); |
| } |
| } |
| |
| void main() { |
| runApp(new HelloWorldApp()); |
| } |
| '''; |