-
-
Save rndD/3f3d33456c6137294b983816a41b34c5 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 | |
# Если в параметрах нет i или install, вызываем оригинальный npm | |
[[ $INSTALL == "false" ]] && $NPM $ARGUMENTS && exit 0 | |
echo "==> Running npm wrapper script with node_modules caching" | |
SHRINKWRAP="$PWD/npm-shrinkwrap.json" | |
PACKAGE_DEPS="${PWD}/package.json" | |
if [[ -f $SHRINKWRAP ]]; then | |
PACKAGE_DEPS=$SHRINKWRAP | |
fi | |
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 | |
if [[ $? -ne 0 ]]; then | |
echo "Something went wrong!" | |
exit 1 | |
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
@ket4yii ^ форкай =)