@rxdi/firelink
Sync packages when deploying monorepos
with firebase using yarn
or bolt
workspaces
Have you ever have a problem when deploying
npm
package withmonorepos
insidefirebase functions
? You are really lucky then! Skip this library!
If you have problem resolving your package since it is only virtually present as a symlink inside your
monorepo
then you should try@rxdi/firelink
This repository is a complete replacement for
firebase
function.
The only purpose is to
copy
mapped modules insidepackage.json
before working withfirebase
CLI. This way when deploying applicationnpm
will install packages locallyfile:./.packages/database
instead from global registry.
Features
- No dependencies
-
firebase
command replacement - Created with Typescript
- 7 KB bundle
Installation
Using npm
npm i -g @rxdi/firelink
Using binary
wget https://github.com/rxdi/firelink/releases/download/v0.7.69/firelink-linux
Give it permission to execute
chmod +x firelink-linux
./firelink-linux
Alias
sudo ln -s ./firelink-linux /bin/firelink
There are multiple binaries for mac
, windows
and linux
There is only one tested in linux
so keep in mind that for mac
and windows
may not work!
If the binaries don't work in mac
or windows
please install it via npm
globally with npm i -g @rxdi/firelink
The tool assumes @group/package-name
naming convention
Usage
fireDependencies
inside package.json
Add {
"fireDependencies": {
"@graphql/database": "../../packages/database",
"@graphql/shared": "../../packages/shared",
"@graphql/introspection": "../../packages/introspection"
}
}
Usage
firelink deploy
The same as firebase deploy
the only differance is that it will COPY monorepos replace package.json > dependencies with appropriate local file structure and then will revert changes after firebase
script exit
Leave changes to package.json after command execution exited
firelink --leave-changes
This command will create package.temp.json
which is original
configuration before modifications
Revert changes
firelink --revert-changes
Reverts changes from package.temp.json
to original package.json
and deleting package.temp.json
If command firelink --leave-changes
is executed multiple times package.temp.json
will remain the same as the first time command firelink --leave-changes
is executed.
Example:
Before
{
"dependencies": {
"@graphql/database": "^1.0.0",
"@graphql/shared": "^1.0.0",
"@graphql/introspection": "^1.0.0"
}
}
After
{
"dependencies": {
"@graphql/database": "file:./.packages/database",
"@graphql/shared": "file:./.packages/shared",
"@graphql/introspection": "file:./.packages/introspection"
}
}
No runner
With argument no-runner
no actual script will be executed after the copy logic.
This will help us to benefit from the firelink
to do his magic without running a command firebase
or other specified inside fireConfig.runner
. This way we can use the logic for firelink only to prepare the environment and change package.json
with appropriate installation directory configured inside fireDependencies
.
It is recommended to be used with --leave-changes
since it will create a temporary file called package-temp.json
in order at some point to revert the side effects from running the command:
firelink --no-runner --leave-changes
Revert the changes made inside package.json
firelink --no-runner --revert-changes
rsync
Native Nodejs Copy instead of This argument is introduced due to recent issue that has being made https://github.com/rxdi/firelink/issues/55 It appears that in the newest nodejs 16 docker image rsync package is missing
There is a way to specify which runner firelink will use
when specify --use-native-copy
it will default to nodejs implementation of recursive copy the files
By default in windows environment this is the main method used to copy files since rsync
is missing in windows
firelink --use-native-copy
Configuration
Default runner is command firebase
but you can change it for example to gcloud
or serverless
by defining fireConfig
inside package.json
{
"fireConfig": {
"runner": "firebase",
"outFolderName": ".packages",
"outFolderLocation": ".",
"excludes": ["node_modules"],
"useNativeCopy": true
}
}
excludes
property can exclude some folders or files from being copied it accepts Array
from string
For example we may want to install dependencies of the packages when deploying using local npm path, so we want to not waste time duplicating node modules
Equivalent of excludes inside package.json .fireignore
can be specified as a file inside a directory where the command firelink
will be executed. .fireignore
behaviour is the same as .gitignore
If you do not wish to use .fireignore
file name the name can be specified from fireConfig.excludesFileName
By default packages will be saved in .packages
folder and current
directory will be used
U can change that by specifiyng properties outFolderName
and outFolderLocation
inside fireConfig
Check example
folder inside this repository
You can put even dir
command
{
"fireConfig": {
"runner": "dir"
}
}
When executing firelink
you will be referenced to dir
function so you will get list of folders inside current directory.
dist node_modules package.json README.md src tsconfig.json yarn.lock