Skip to content

potherca-bash/inline-source

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Inline source

Inline source-ed code.

Installation

The advised installation method is using the bpkg package manager, as this will allow versioning to be used.

Alternatively, the latest version of this project's main script can be downloaded directly:

curl -Lo- https://bpkg.pother.ca/inline-source/dist/inline_source
chmod +x inline_source

Usage

This script will output a file for a given path, will all sourced files inlined.

inline_source <source-file>

For instance, given a file a.sh and file b.sh like this:

a.sh

#!/usr/bin/env bash

echo 'I am file A.'

source 'b.sh.'

b.sh

#!/usr/bin/env bash

echo 'I am file B.'

Calling inline_source a.sh will output:

#!/usr/bin/env bash

echo 'I am file A.'

echo 'I am file B.'

If a script sources files that are not in the $PATH, this will need to be resolved before calling inline_source:

export PATH="${PATH}:/path/to/sources" && inline_source a.sh

All that really happens is that the code of any file that is sourced in the main script is placed inline.

This allows for a single script to be created for distribution purposes.

For instance, the distribution file in this repo was created by pipe-ing the output to a file:

inline_source inline_source.sh > dist/inline_source

The script leaves everything "as-is", except for any shebang lines that it might find. To clean things up, pipe this script through a formatter, for instance shfmt:

inline_source inline_source.sh | shfmt -i 2 -ci -s > dist/inline_source

Development

This repository is set up like this:

    .
    ├── deps/       <-- Third-party dependencies
    ├── dist/       <-- Bundled distribution script
    ├── src/        <-- Source files
    ├── bpkg.json   <-- Package declaration
    └── README.md   <-- You are here

Dependencies needed by this project are managed through bpkg.

To install them (in the deps/ folder) run:

bpkg getdeps

After that, edits can be made to files in the src/ directory.

Finally, to create a single file containing all the source logic (this time using a docker image for shfmt), run:

bash inline_source.sh inline_source.sh \
  | docker run -i --rm --volume="$PWD:/mnt" -w /mnt mvdan/shfmt -i 2 -ci -s \
  > dist/inline_source

This will create a distribution file in the dist/ directory.