forked from shuhrat/npm-inject
-
Notifications
You must be signed in to change notification settings - Fork 0
/
npm
88 lines (70 loc) · 2.74 KB
/
npm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/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
if [[ $INSTALL == "false" ]]; then
$NPM $ARGUMENTS
exit $?
fi
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
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