npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]
Эта команда удаляет «посторонние» пакеты. Если указано имя пакета, удаляются только пакеты, соответствующие одному из предоставленных имен.
Посторонние пакеты - это пакеты, которые не перечислены в списке зависимостей родительского пакета.
Если указан флаг - production или для переменной среды NODE_ENV установлено значение production , эта команда удалит пакеты, указанные в . ] devDependencies . Установка - без производства будет отменять NODE_ENV , установленный на производство .
Если используется флаг - всухую , то никаких изменений фактически не будет.
Если используется флаг - json , то изменения npm prune , сделанные (или сделанные с - всухую ), будут напечатаны как объект JSON.
При нормальной работе с включенными блокировками пакетов посторонние модули автоматически удаляются при установке модулей, и вам понадобится только эта команда с флагом - production .
Если вы отключили блокировки пакетов, посторонние модули не будут удалены, и вы можете время от времени запускать npm prune для их удаления.
npm dedupe
npm ddp
Выполняет поиск в локальном дереве пакетов и пытается упростить общую структуру, перемещая зависимости дальше вверх по дереву, где они могут более эффективно использоваться несколькими зависимыми пакетами. .
Например, рассмотрим этот график зависимости:
a
+-- b <-- depends on c@1.0.x
| `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
`-- c@1.0.10
В этом случае npm-dedupe преобразует дерево в:
a
+-- b
+-- d
`-- c@1.0.10
Из-за иерархическая природа поиска модулей узла, b и d, получит свою зависимость, встречаемую одним пакетом c на корневом уровне дерева.
Алгоритм дедупликации обходит дерево, перемещая каждую зависимость как можно выше в дереве, даже если дубликаты не найдены. Это приведет как к плоскому, так и к дедуплицированному дереву.
У меня та же проблема с пользовательским представлением и OnGestureListener onFling. Выяснили это:
Независимо от того, используете ли вы GestureDetector.SimpleOnGestureListener, вы всегда должны реализовывать метод onDown (), который возвращает true.
Источник: http://developer.android.com/training/custom-views/making-interactive.html
Я впервые столкнулся с этой проблемой с Android 4.0, так как мой код работает нормально во всех предыдущих версиях. Получив подсказку из приведенных здесь предложений, я нашел простой обходной путь - просто отслеживать событие onDown и использовать его вместо первого параметра onFling в случае, если оно окажется нулевым.
public class MySimpleGestureListener extends SimpleOnGestureListener {
protected MotionEvent mLastOnDownEvent = null;
@Override
public boolean onDown(MotionEvent e) {
mLastOnDownEvent = e;
return true;//super.onDown(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1==null)
e1 = mLastOnDownEvent;
if (e1==null || e2==null)
return false;
float dX = e2.getX()-e1.getX();
float dY = e2.getY()-e1.getY();
...rest of code
}
...rest of class
}