-
-
Save korotindev/4acde962667848d98d874df0cfb967ad to your computer and use it in GitHub Desktop.
Npm inject для кеширования папки node_modules
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Фейковый npm | |
# Нужен для кэширования папки node_modules | |
# Кэш находится в папке ~/.cache/npm-inject/[sha1 хэш файла package.json]/node_modules | |
# | |
# В PATH надо добавить путь папки с фейковым npm, таким образом при выполнении команды `npm install` | |
# bash вызовет фейковый npm c параметром `install`. | |
# Фейк проверяет наличие папки [sha1 хэш файла package.json] в кэше. | |
# Если она в кэше, создаем на неё симлинк node_modules | |
# Иначе вызываем оригинальный npm (вторая позиция в `which -a npm`), копируем node_modules в кэш | |
# | |
# Если указать переменную окружения NPM_INJECT_COPY=1, то вместо симлинка кэш будет скопирован. | |
# | |
# @author Shuhrat Shadmonkulov <[email protected]> | |
set -e | |
[[ -n ${DEBUG} ]] && set -x | |
INSTALL="false" | |
ARGUMENTS=$@ | |
NPM=$(which -a npm | sed -n 2p) # Ищем оригинальный npm | |
while [ "$#" -gt "0" ]; do | |
case $1 in | |
i|install) | |
INSTALL="true" | |
;; | |
esac | |
shift | |
done | |
SHRINKWRAP="$PWD/npm-shrinkwrap.json" | |
# Если в параметрах нет i или install или нет файла npm-shrinkwrap.json вызываем оригинальный npm | |
if [[ $INSTALL == "false" ]] || [[ ! -f "$SHRINKWRAP" ]]; then | |
$NPM $ARGUMENTS | |
exit $? | |
fi | |
echo "==> Running npm wrapper script with node_modules caching" | |
PACKAGE_DEPS=$SHRINKWRAP | |
PACKAGES_HASH=$(openssl sha1 $PACKAGE_DEPS | awk '{print $2}') | |
echo "sha1 of $PACKAGE_DEPS is $PACKAGES_HASH" | |
NODE_MODULES="$PWD/node_modules" | |
CACHE_DIR="$HOME/.cache/npm-inject/$PACKAGES_HASH" | |
# Удаляем существующие модули, могли протухнуть | |
echo "Removing existing node_modules if any" | |
rm -rf "$NODE_MODULES" | |
# Если существует кэш, слинковать его в $NODE_MODULES | |
if [[ -d $CACHE_DIR ]]; then | |
echo "Cache found: $CACHE_DIR" | |
else | |
echo "Cache not found" | |
# Вызываем оригинальный npm | |
echo "==> Executing: $NPM $ARGUMENTS" | |
$NPM $ARGUMENTS | |
NPM_EXIT_CODE=$? | |
if [[ $NPM_EXIT_CODE -ne 0 ]]; then | |
echo "Something went wrong!" | |
exit $NPM_EXIT_CODE | |
fi | |
echo "==> Creating $CACHE_DIR" | |
mkdir -p "$CACHE_DIR" | |
echo "Caching $NODE_MODULES" | |
mv "$NODE_MODULES" "$CACHE_DIR" | |
fi | |
if [[ -n ${NPM_INJECT_COPY} ]]; then | |
echo "Copying $CACHE_DIR/node_modules to $NODE_MODULES" | |
cp -RP "$CACHE_DIR/node_modules" "$NODE_MODULES" | |
else | |
echo "Linking $CACHE_DIR/node_modules to $NODE_MODULES" | |
ln -s "$CACHE_DIR/node_modules" "$NODE_MODULES" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment