Skip to content

Instantly share code, notes, and snippets.

@rndD
Created July 9, 2016 12:19
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rndD/3f3d33456c6137294b983816a41b34c5 to your computer and use it in GitHub Desktop.
Save rndD/3f3d33456c6137294b983816a41b34c5 to your computer and use it in GitHub Desktop.
Npm inject для кеширования папки node_modules
#!/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 <zumra6a@yandex-team.ru>
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
@rndD
Copy link
Author

rndD commented Jul 9, 2016

Для использования:

  • Нужно сделать этот файл исполняемым
  • Добавить его в PATH

Теперь просто используйте npm как обычно.

@rndD
Copy link
Author

rndD commented Jul 9, 2016

@zumra6a надеюсь ты не против что я выложил.

@vslinko
Copy link

vslinko commented Jul 29, 2016

[[ $INSTALL == "false" ]] && $NPM $ARGUMENTS && exit 0
  $NPM $ARGUMENTS

  if [[ $? -ne 0 ]]; then
    echo "Something went wrong!"
    exit 1
  fi

Мне кажется, что не стоит подменять код возврата оригинального npm.

@korotindev
Copy link

Полностью согласен с @vslinko

@ketchoop
Copy link

А форкнуть это чудо можно? Просто хочется добавить expire для кэшей, да и хочется для такой вещи иметь реп отдельный.

@rndD
Copy link
Author

rndD commented Nov 24, 2016

@vslinko да ты прав, стоит возвращать оригинальный код выхода. Спасибо!

@shuhrat
Copy link

shuhrat commented Nov 24, 2016

коллеги создал репо https://github.com/shuhrat/npm-inject
+1 к @vslinko

@rndD
Copy link
Author

rndD commented Nov 24, 2016

@ket4yii ^ форкай =)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment