Jump to content
Jump to navigation

Jump to heading Scaffolding a new app

Phabalicious has a simple but powerful app:scaffold-command. It will read a yml-file and interpret the contents. It will use the existing pattern-replacement used for scripts and twig for changing file-contents. The scaffolding and fixture-files can live on a remote server or on your file-system.

Here's an example of an app scaffold-file:

questions:
  name:
    question: "The Name of this project"
  shortName:
    question: "The short-name of this project"
    validation: "/^[A-Za-z0-9]{3,5}$/"
    error: "The shortname may consist of 3 to 5 letters (A-Z) or digits (0-9)"
    # Questions can have a default:
    default: "SP"
    transform: lowercase

variables:
  composerProject: drupal-composer/drupal-project:8.x-dev
  webRoot: web
  allowOverride: 0 # Setting it to 1 will not show a warning if the target folder exists.
  skipSubfolder: 0 # Setting it to 1 will instruct phabalicious to not create a subfolder.

assets:
  - .fabfile.yaml
  - docker-compose.yml
  - docker-compose-mbb.yml

deployModuleAssets:
  - deployModule/%shortName%_deploy.info.yml
  - deployModule/%shortName%_deploy.module
  - deployModule/%shortName%_deploy.install

scaffold:
  - rm -rf %rootFolder%
  - composer create-project %composerProject% %rootFolder% --stability dev --no-interaction
  - cd %rootFolder%; composer require drupal/coffee
  - cd %rootFolder%; composer require drupal/devel
  - copy_assets(%rootFolder%)
  - copy_assets(%rootFolder%/%webRoot%/modules/custom/%shortName%_deploy, deployModuleAssets)
  - cd %rootFolder%; git init .
  - cd %rootFolder%; git add .
  - cd %rootFolder%; git commit -m "Initial commit by phabalicious"

The fabfile needs at least the questionsand the scaffold-section. The scaffold-section is a list of commands, executed by phabalicious one by one. It will use the pattern-replacement known for scripts.

Jump to heading The questions-section

This section contains a list of questions to be asked when running the scaffold-command. The yaml-key will get the value inputted by the user and can be used as a replacement pattern or in twig-templates. Answers can be validated against a regex and/or transformed to lower- or uppercase.

The following question-types are supported:

Jump to heading question

A regular question, with optional default, validation and/ or autocomplete values. If hidden is true then the user wont see their input, ideal for sensitive data like passwords.

key:
  question: the prompot to show
  type: question
  validation: the regex to use to validate the input
  error: the message to display, if the validation fails
  default: the default-value, when the user hits return
  transform: [lowercase|uppercase]
  hidden: [true|false]
  autocomplete:
    - Option 1
    - Option 2
    - Option 3

Jump to heading array

A question, where the use can supply multiple values. The question gets repeated until the user provides an empty answer. For possible options see question.

Jump to heading confirm

A question which can be answered with yes or no. The value will be 1 or 0. The default value can be true or false.

key:
  question: Should we continue?
  type: confirm
  default: true

Jump to heading choices

Choices provides a list of options, where the user can pick one or many answers from:

key:
  question: What fruits do you want to buy
  type: choices
  multiselect: true
  choices:
    - Apples
    - Oranges
    - Lemons
    - Papayas
    - Coconuts

Jump to heading Non-interactive usage

For non-interactive usage you can pass the values via commandline-options, where the option-name is dash-cased version of the key, for the above example:

command-line option Question key
--[key] [key]
--name name
--short-name shortName

The scaffolder stores the answers in a hidden file called .phab-scaffold-tokens in the newly created folder and will reuse if the scaffolder runs aagain.

Jump to heading The scaffold-section

Phabalicious will provide the following replacement-patterns out of the box:

Pattern Value
%rootFolder% The folder the app will be installed into
%name% The name of the app
%projectFolder% a cleaned version of the app-name, suitable for machine-names.
%shortName% The short-name
%uuid% a random-uuid

Jump to heading the variables-section

You can add own variables via the variables-section. In the above example, the variable composerProject will be available in the scaffold-section via the pattern %composerProject%

Jump to heading the assets-section

You can have multiple assets-sections, assets is a default one. It contains a list if template files which will be processed by twig and placed at a specific location. You'll have all variables available as twig-variables inside the template, to use them, use {{ theNameOfVariable }} e.g. {{ name }} To add a new asset-section, use a new root-level key (in the above example this would be deploymentModuleAssets

The assets-paths must be relative to the yaml-file containing the scaffold-commands.

Jump to heading List of supported internal commands

  • copy_assets
  • alter_json_file
  • log_message

These are documented here.

Jump to heading Inheritance

Similar to other parts of Phabalicious, scaffold-files can use inheritance, for example to use the above scaffold-file, but install drupal commerce:

inheritsFrom:
  - drupal-8.yml
  -
variables:
  composerProject: drupalcommerce/project-base

This will inherit all content from the drupal-8.yml-file and merged with this content. This means, the `composerProject´-variable will be overridden, but everything else will be inherited. This makes it easy to reuse existing scaffold-files

Jump to heading Examples

Jump to heading Drupal 8 (d8.yml)

variables:
  composerProject: drupal-composer/drupal-project:8.x-dev
  webRoot: web
assets:
  - .fabfile.yaml
  - docker-compose.yml
  - docker-compose-mbb.yml

deployModuleAssets:
  - deployModule/%shortName%_deploy.info.yml
  - deployModule/%shortName%_deploy.module
  - deployModule/%shortName%_deploy.install

sshKeys:
  - ssh-keys/docker-root-key
  - ssh-keys/docker-root-key.pub
  - ssh-keys/known_hosts

scaffold:
  - rm -rf %rootFolder%
  - composer create-project %composerProject% %rootFolder% --stability dev --no-interaction
  - cd %rootFolder%; composer require drupal/coffee
  - cd %rootFolder%; composer require drupal/devel
  - copy_assets(%rootFolder%)
  - copy_assets(%rootFolder%/%webRoot%/modules/custom/%shortName%_deploy, deployModuleAssets)
  - copy_assets(%rootFolder%/ssh-keys, sshKeys)
  - cd %rootFolder%; git init .
  - cd %rootFolder%; git add .
  - cd %rootFolder%; git commit -m "Initial commit by phabalicious"

Jump to heading drupal commerce

inheritsFrom:
  - d8.yml

variables:
  composerProject: drupalcommerce/project-base

Jump to heading thunder

inheritsFrom:
  - d8.yml

variables:
  composerProject: burdamagazinorg/thunder-project
  webRoot: docroot

Jump to heading Laravel

Jump to heading the scaffold-file:

variables:
  composerProject: laravel/laravel:5.4
  webRoot: public

assets:
  - .fabfile.yaml
  - docker-compose.yml
  - docker-compose-mbb.yml

scaffold:
  - rm -rf %rootFolder%
  - composer create-project %composerProject% %rootFolder% --stability dev --no-interaction
  - copy_assets(%rootFolder%)
  - cd %rootFolder%; git init .
  - cd %rootFolder%; git add .
  - cd %rootFolder%; git commit -m "Initial commit by phabalicious"

Jump to heading the fabfile-template

name: {{ name }}
key: {{ shortName }}
deploymentModule: {{ shortName }}_deploy

requires: 2.0.0

needs:
  - ssh
  - composer
  - docker
  - git
  - files

hosts:
  mbb:
    host: {{ projectFolder }}.test
    user: root
    port: {{ 1024 + random(20000) }}
    type: dev
    rootFolder: /var/www/{{ webRoot }}
    gitRootFolder: /var/www
    backupFolder: /var/www/backups
    branch: develop
    database:
      name: {{ projectFolder|replace({'-': '_'}) }}_db
      user: root
      pass: admin
      host: mysql