Coder Social home page Coder Social logo

projen's Introduction

License

All Contributors

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: "[email protected]",
  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 come with an assortment of tasks that handle various development activities, from compiling to publishing. Tasks can be and composed together, and can be run as local commands or turned into GitHub workflows. You can list all tasks with npx projen --help:

$ npx projen --help
projen [command]

Commands:
  projen new [PROJECT-TYPE-NAME] [OPTIONS]  Creates a new projen project
  projen clobber                            hard resets to HEAD of origin and cleans the local repo
  projen compile                            Only compile
  projen test:compile                       compiles the test code
  projen test                               Run tests
  projen build                              Full release build (test+compile)
  projen upgrade-dependencies               upgrade dependencies
  projen upgrade-projen                     upgrade projen
...

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

Shell Completions

If installed as a global package, projen includes rich shell tab-completion support. To enable this in your shell, run:

# Bash
projen completion >> ~/.bashrc

# ZSH
projen completion >> ~/.zshrc

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 (manual releases are currently broken! #726)
  • 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 [email protected], file:/path/to/local/folder, [email protected]/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();

Roadmap

See Vision.

FAQ

Do I have to write my configuration in JavaScript?

Not at all! JavaScript is the default, but it's also possible to write it in Java, TypeScript, or even JSON. Python support is also planned. This is made possible by the jsii library which allows us to write APIs once and generate libraries in several languages. You can choose a different language by passing the --projenrc-ts, --projenrc-java, or --projenrc-json flags when running projen new.

Note: using a .projenrc.json file to specify configuration only allows accessing a subset of the entire API - the options which are passed to the constructor of each project type.

Contributions

Contributions of all kinds are welcome! Check out our contributor's guide and our code of conduct.

For a quick start, check out a development environment:

$ git clone [email protected]:projen/projen
$ cd projen
$ yarn
$ yarn watch # compile in the background

Thanks goes to these wonderful people (emoji key):


Elad Ben-Israel

πŸ’»

Christopher Rybicki

πŸ’»

Philip M. Gollucci

πŸ’»

Thorsten Hoeger

πŸ’»

Kenneth Winner

πŸ’»

Jordan Sinko

πŸ’»

Josh Kellendonk

πŸ’»

andrestone

πŸ’»

Cristian PallarΓ©s

πŸ’»

Jonathan Goldwasser

πŸ’»

Matthew Bonig

πŸ’»

Pahud Hsieh

πŸ’»

Adam Elmore

πŸ’»

Ash

πŸ’»

Jacob

πŸ’»

Kraig Amador

πŸ’»

Martin Muller

πŸ’»

Tomasz Łakomy

πŸ’»

john-tipper

πŸ’»

Henry Sachs

πŸ’»

Joseph Egan

πŸ’»

Sebastian Korfmann

πŸ’»

Bart Callant

πŸ’»

Campion Fellin

πŸ’»

Grady Barrett

πŸ’»

Hassan Mahmud

πŸ’»

Hassan Mahmud

πŸ’»

Jake Pearson

πŸ’»

Jeremy Jonas

πŸ’»

Matt Martz

πŸ’»

Max KΓΆrlinge

πŸ’»

Neil Kuan

πŸ’»

Rafal Wilinski

πŸ’»

Romain Marcadier

πŸ’»

Thomas Klinger

πŸ’»

Tobias

πŸ’»

flyingImer

πŸ’»

Aatman

πŸ’»

Mark McCulloh

πŸ’»

Samuel Tschiedel

πŸ’»

Eli Polonsky

πŸ’»

Alexander Steppke

πŸ’»

Balagopal Kanattil

πŸ’»

Jan Brauer

πŸ’»

Mark Nielsen

πŸ’»

Mitchell Valine

πŸ’»

Neil Kuan

πŸ’»

Philipp Garbe

πŸ’»

Shawn MacIntyre

πŸ’»

Tobias

πŸ’»

Yigong Liu

πŸ’»

Eduardo Rodrigues

πŸ’»

Hassan Azhar

πŸ’»

Julian Michel

πŸ’»

lmarsden

πŸ’»

Adrian Mace

πŸ’»

Heiko Rothe

πŸ’»

Henri Yandell

πŸ’»

Matthew Gamble

πŸ’»

License

Distributed under the Apache-2.0 license.

projen's People

Contributors

dependabot[bot] avatar mergify[bot] avatar chriscbr avatar github-actions[bot] avatar pgollucci avatar cdklabs-automation avatar iliapolo avatar hoegertn avatar kcwinner avatar gradybarrett avatar romainmuller avatar misterjoshua avatar markmcculloh avatar skyrpex avatar pahud avatar andrestone avatar mbonig avatar jordansinko avatar hassanazharkhan avatar skorfmann avatar john-tipper avatar mmuller88 avatar jumic avatar jogold avatar abelmokadem avatar hunter-thompson avatar eganjs avatar henrysachs avatar mtimbs avatar lmarsden avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.