A tool to generate project templates and file trees for any programming language or framework.
To define a template just declare a file tree where variables will be in the format
___VAR_NAME___
. Variables will be detected in file paths and
in file contents.
Example of a Template file tree:
___project_name_dir___/.gitignore
___project_name_dir___/bin/___project_name_dir___.dart
___project_name_dir___/CHANGELOG.md
___project_name_dir___/project_template.yaml
___project_name_dir___/pubspec.yaml
___project_name_dir___/README.md
Content example for the README.md
entry above:
# ___project_name___
___project_description___
## Usage
CLI:
`$> ___project_name_dir___ -h`
## See Also
- ___homepage___
You can declare a project manifest at project_template.yaml
:
project_name:
description: The name of the project.
example: Simple App
project_name_dir:
description: The project directory name.
example: simple_app
project_description:
description: The project description for `pubspec.yaml`.
example: A simple project.
default: A project from template.
- Variables with a
default
value won't be mandatory when using the CLI commandcreate
.
The package can be used as a command-line interface (CLI) or as a Dart library to be imported in other projects or other CLI tools.
You can use the built-in command-line: project_template
To activate it globally:
$> dart pub global activate project_template
Now you can use the CLI directly:
$> project_template --help
Prepare a Template from a directory into a single file. The resulting file should be used by command create
.
Prepare to a JSON
file:
$> project_template prepare -d example/template-example -r ".DS_Store$" -o /tmp/template-x.json
Prepare to a Zip
file:
$> project_template prepare -d example/template-example -r ".DS_Store$" -o /tmp/template-x.zip
- -d: The Template directory/source.
- Source types:
- Directory:
path/to/template-directory
- Zip file:
path/to/template-x.zip
- Tar+gZip file:
path/to/template-x.tar.gz
- Tar file:
path/to/template-x.tar
- Directory:
- Source types:
- -r: A
RegExp
of a file path to ignore. - -o: The prepared Template output file (to be used by
create
command below).- Output File formats:
- Zip file:
path/to/template-x.zip
- Tar+gZip file:
path/to/template-x.tar.gz
- Tar file:
path/to/template-x.tar
- JSON file:
path/to/template-x.json
- YAML file:
path/to/template-x.yaml
- Zip file:
- Output File formats:
Show information about a Template (files, variables and manifest):
$> project_template info -t /tmp/template-x.zip
- -t: The template path.
- Path types:
- Directory:
path/to/template-directory
- Zip file:
path/to/template-x.zip
- Tar+gZip file:
path/to/template-x.tar.gz
- Tar file:
path/to/template-x.tar
- JSON file:
path/to/template-x.json
- YAML file:
path/to/template-x.yaml
- Directory:
- Path types:
Create/build a file tree from a Template:
$> project_template create -t /tmp/template-x.zip -p project_name_dir=foo -p project_name=Foo -p "project_description=Foo project." -p homepage=http://foo.com -o /tmp/project-x
- -t: The template path.
- Path types:
- Directory:
path/to/template-directory
- Zip file:
path/to/template-x.zip
- Tar+gZip file:
path/to/template-x.tar.gz
- Tar file:
path/to/template-x.tar
- JSON file:
path/to/template-x.json
- YAML file:
path/to/template-x.yaml
- Directory:
- Path types:
- -p: A template property/variable definition.
- -o: The output directory/zip/tar.gz (where the resolve project file tree will be generated).
- Output types:
- Directory:
path/to/template-directory
- Zip file:
path/to/template-x.zip
- Tar+gZip file:
path/to/template-x.tar.gz
- Tar file:
path/to/template-x.tar
- Directory:
- Output types:
Here's a simple example that loads a Template
from a directory,
resolves/builds it (with the variables
definitions)
and then saves it to a new directory.
import 'dart:io';
import 'package:project_template/src/project_template_storage_io.dart';
void main() async {
var sourceDir = Directory('path/to/template-dir');
// The template storage:
var storage = StorageIO.directory(sourceDir)
..ignoreFiles.add('.DS_Store');
// List files at storage:
var files = storage.listFiles();
// Load a Template using storage files:
var template = await storage.loadTemplate();
// Parse the Template files and identify the variables:
var variables = template.parseTemplateVariables();
// Return the Template manifest (`project_template.yaml`).
var manifest = template.getManifest();
// Define the variables to build a template:
var variables = {
'project_name': 'Project X',
'project_name_dir': 'project_x',
'homepage': 'https://project-x.domain',
};
// Resolve/build the template:
var templateResolved = template.resolve(variables);
// Print all Template files as a YAML document:
print(templateResolved.toYAMLEncoded());
var saveDir = Directory('/path/to/workspace');
// Save `templateResolved` files to `/path/to/workspace/project_x`:
var storageSave = StorageIO.directory(saveDir);
templateResolved.saveTo(storageSave, 'project_x');
}
See the example for more.
To use this library in your code, see the API documentation.
The CLI classes, based on Command (used with CommandRunner) of package args, are also exposed to be integrated with other projects and other CLI tools.
Here's an example of a tool-x
using project_template_cli
:
import 'dart:io';
import 'package:args/command_runner.dart';
import 'package:project_template/project_template_cli.dart';
void _consolePrinter(Object? o) {
print(o);
}
const String cliTitle = '[Tool-X/${Template.version}]';
void main(List<String> args) async {
var commandRunner =
CommandRunner<bool>('tool-x', '$cliTitle - CLI Tool')
..addCommand(CommandInfo(cliTitle, _consolePrinter))
..addCommand(CommandCreate(cliTitle, _consolePrinter))
..addCommand(CommandPrepare(cliTitle, _consolePrinter));
var ok = await commandRunner.run(args) ;
exit(ok ? 0 : 1);
}
Please file feature requests and bugs at the issue tracker.
Graciliano M. Passos: gmpassos@GitHub.