Skip to main content

A new generation of project generators

Project description

License Gitpod ready-to-code Build Release

projen

projen logo

Define and maintain complex project configuration through code.

JOIN THE #TemplatesAreEvil MOVEMENT!

projen synthesizes project configuration files such as package.json, tsconfig.json, .gitignore, GitHub Workflows, eslint, jest, etc from a well-typed definition written in JavaScript.

Check out this talk about projen.

As opposed to existing templating/scaffolding tools, projen is not a one-off generator. Synthesized files should never be manually edited (in fact, projen enforces that). To modify your project setup, users interact with rich strongly-typed class and execute projen to update their project configuration files.

Getting Started

To create a new project, run the following command and follow the instructions:

$ mkdir my-project
$ cd my-project
$ git init
$ npx projen new PROJECT-TYPE
🤖 Synthesizing project...
...

Currently supported project types (use npx projen new without a type for a list):

Use npx projen new PROJECT-TYPE --help to view a list of command line switches that allows you to specify most project options during bootstrapping. For example: npx projen new jsii --author-name "Jerry Berry".

The new command will create a .projenrc.js file which looks like this for jsii projects:

const { JsiiProject } = require('projen');

const project = new JsiiProject({
  authorAddress: "elad.benisrael@gmail.com",
  authorName: "Elad Ben-Israel",
  name: "foobar",
  repository: "https://github.com/eladn/foobar.git",
});

project.synth();

This program instantiates the project type with minimal setup, and then calls synth() to synthesize the project files. By default, the new command will also execute this program, which will result in a fully working project.

Once your project is created, you can configure your project by editing .projenrc.js and re-running npx projen to synthesize again.

The files generated by projen are considered an "implementation detail" and projen protects them from being manually edited (most files are marked read-only, and an "anti tamper" check is configured in the CI build workflow to ensure that files are not updated during build).

For example, to setup PyPI publishing in jsii projects, you can use python option:

const project = new JsiiProject({
  // ...
  python: {
    distName: "mydist",
    module: "my_module",
  }
});

Run:

npx projen

And you'll notice that your package.json file now contains a python section in it's jsii config and the GitHub release.yml workflow includes a PyPI publishing step.

We recommend to put this in your shell profile, so you can simply run pj every time you update .projenrc.js:

alias pj='npx projen'

Most projects support a start command which displays a menu of workflow activities:

$ yarn start
? Scripts: (Use arrow keys)

  BUILD
❯ compile          Only compile
  watch            Watch & compile in the background
  build            Full release build (test+compile)

  TEST
  test             Run tests
  test:watch       Run jest in watch mode
  eslint           Runs eslint against the codebase

  ...

The build command is the same command that's executed in your CI builds. It typically compiles, lints, tests and packages your module for distribution.

Features

Some examples for features built-in to project types:

  • Fully synthesize package.json
  • Standard npm scripts like compile, build, test, package
  • eslint
  • Jest
  • jsii: compile, package, api compatibility checks, API.md
  • Bump & release scripts with CHANGELOG generation based on Conventional Commits
  • Automated PR builds
  • Automated releases to npm, maven, NuGet and PyPI
  • Mergify configuration
  • LICENSE file generation
  • gitignore + npmignore management
  • Node "engines" support with coupling to CI build environment and @types/node
  • Anti-tamper: CI builds will fail if a synthesized file is modified manually

API Reference

See API Reference for API details.

In addition, several projen components and project types are explained with examples in /docs (currently a work in progress!).

Ecosystem

projen takes a "batteries included" approach and aims to offer dozens of different project types out of the box (we are just getting started). Think projen new react, projen new angular, projen new java-maven, projen new awscdk-typescript, projen new cdk8s-python (nothing in projen is tied to javascript or npm!)...

Adding new project types is as simple as submitting a pull request to this repo and exporting a class that extends projen.Project (or one of it's derivatives). Projen automatically discovers project types so your type will immediately be available in projen new.

Projects in external modules

projen is bundled with many project types out of the box, but it can also work with project types and components defined in external jsii modules (the reason we need jsii is because projen uses the jsii metadata to discover project types & options in projen new).

Say we have a module in npm called projen-vuejs which includes a single project type for vue.js:

$ npx projen new --from projen-vuejs

If the referenced module includes multiple project types, the type is required. Switches can also be used to specify initial values based on the project type APIs. You can also use any package syntax supported by yarn add like projen-vuejs@1.2.3, file:/path/to/local/folder, git@github.com/awesome/projen-vuejs#1.2.3, etc.

$ npx projen new --from projen-vuejs@^2 vuejs-ts --description "my awesome vue project"

Under the hood, projen new will install the projen-vuejs module from npm (version 2.0.0 and above), discover the project types in it and bootstrap the vuejs-ts project type. It will assign the value "my awesome vue project" to the description field. If you examine your .projenrc.js file, you'll see that projen-vuejs is defined as a dev dependency:

const { VueJsProject } = require('projen-vuejs');

const project = new VueJsProject({
  name: 'my-vuejs-sample',
  description: "my awesome vue project",
  // ...
  devDeps: [
    'projen-vuejs'
  ]
});

project.synth();

Contributing

Contributions of all kinds are welcome! See our code of conduct.

To check out a development environment:

$ git clone git@github.com:projen/projen
$ cd projen
$ yarn

For more information, check out our contributor's guide.

Roadmap

A non-exhaustive list of ideas/directions for projen

  • Multi-language support: ideally projenrc should be in the same language as your application code.
  • External components & projects: projen new should be able to list project types from registered 3rd party modules so we can grow the ecosystem easily.
  • Components: re-think/re-factor how components and projects interact to allow more modular and composable usage.
  • Discoverability of external components/modules through the CLI
  • Support projenrc in YAML (fully declarative, if one desires)
  • projen SCRIPT: make the CLI extensible so it can become the project entrypoint (instead of e.g. yarn/npm, etc).
  • CLI bash completion

License

Distributed under the Apache-2.0 license.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

projen-0.15.6.tar.gz (3.7 MB view details)

Uploaded Source

Built Distribution

projen-0.15.6-py3-none-any.whl (3.7 MB view details)

Uploaded Python 3

File details

Details for the file projen-0.15.6.tar.gz.

File metadata

  • Download URL: projen-0.15.6.tar.gz
  • Upload date:
  • Size: 3.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.9

File hashes

Hashes for projen-0.15.6.tar.gz
Algorithm Hash digest
SHA256 eb345a46c5989bcf359d7adb1687c44e35503ee094f9c39fb9a226285625c2f9
MD5 4a7ed6901132c3223ef328a34575b109
BLAKE2b-256 58847d858da1bdd93447fa5c03f8774d0e394092cb6944455bcfdf196ebd5892

See more details on using hashes here.

File details

Details for the file projen-0.15.6-py3-none-any.whl.

File metadata

  • Download URL: projen-0.15.6-py3-none-any.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.9

File hashes

Hashes for projen-0.15.6-py3-none-any.whl
Algorithm Hash digest
SHA256 7555fd1e56ea5be5f0eb443c58617c0017e08f411a6e38096a8b19a1a5dc0aa6
MD5 6f7159e710d0abcee4e11692ccee6b53
BLAKE2b-256 1751fc3da586831e9b45bda393d73c5cdce9cce5d465858d26d5ee69c6e72c36

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page