패키지에서 사용되지 않는 npm 패키지를 찾습니다.제이손
패키지가 있는지 확인할 수 있는 방법이 있습니까?package.json
더 이상 필요하지 않은 파일?
예를 들어, 패키지를 사용해 보고 나중에 코드에 주석을 달거나 삭제했지만 제거하는 것을 잊어버린 경우 삭제할 수 있는 패키지가 몇 개 있습니다.
패키지가 안전하게 삭제될 수 있는지 여부를 결정하는 효율적인 방법은 무엇입니까?
depcheck(노드 버전 10 이상 필요)라는 npm 모듈을 사용할 수 있습니다.
모듈을 설치합니다.
npm install depcheck -g or yarn global add depcheck
이를 실행하여 사용되지 않는 종속성을 찾습니다.
depcheck
이 접근 방식의 좋은 점은 기억할 필요가 없다는 것입니다.find
또는grep
지휘권
설치하지 않고 실행하려면 사용npx
:
npx depcheck
다음과 같은 패키지도 있습니다.
npm 체크
오래된 종속성, 잘못된 종속성 및 사용되지 않는 종속성을 확인합니다.
그것은 꽤 강력하고 활발하게 개발되었습니다.그 중 하나는 사용되지 않는 종속성을 확인하는 기능입니다. 이 부분에 대해서는 다른 답변에 언급된 모듈을 사용합니다.
사용되지 않은 종속성 확인
npm install depcheck -g
depcheck
오래된 라이브러리 확인
npm outdated
여기서 많은 답은 사용하지 않는 항목만 찾는 방법입니다.
만약..나는...
자동으로 -- a) 찾기 + b) 사용하지 않는 항목 제거
아래의 옵션 2가 새로운 방법인 것 같습니다.
옵션 1:
- 이 노드 프로젝트를 설치합니다.
$ npm install -g typescript tslint tslint-etc
- 루트 dir에서 새 파일 tslint-imports.json을 추가합니다.
{
"extends": [
"tslint-etc"
],
"rules": {
"no-unused-declaration": true
}
}
- 자신의 책임 하에 이를 실행하고, 백업을 만듭니다 :)
$ tslint --config tslint-imports.json --fix --project .
옵션 2: Per @Alex & @JacopKane 제안, 감사합니다.
// newer one line option
npx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
// or
npm uninstall $(npx depcheck --oneline)
gombosg의 스크립트는 npm-check보다 훨씬 좋습니다.
조금 수정했으므로 node_modules의 dev 의존성도 발견될 것입니다.
예sass
적은 , 에서 필요합니다.sass-loader
#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME
FILES=$(mktemp)
PACKAGES=$(mktemp)
# use fd
# https://github.com/sharkdp/fd
function check {
cat package.json \
| jq "{} + .$1 | keys" \
| sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES
echo "--------------------------"
echo "Checking $1..."
fd '(js|ts|json)$' -t f > $FILES
while read PACKAGE
do
if [ -d "node_modules/${PACKAGE}" ]; then
fd -t f '(js|ts|json)$' node_modules/${PACKAGE} >> $FILES
fi
RES=$(cat $FILES | xargs -I {} egrep -i "(import|require|loader|plugins|${PACKAGE}).*['\"](${PACKAGE}|.?\d+)[\"']" '{}' | wc -l)
if [ $RES = 0 ]
then
echo -e "UNUSED\t\t $PACKAGE"
else
echo -e "USED ($RES)\t $PACKAGE"
fi
done < $PACKAGES
}
check "dependencies"
check "devDependencies"
check "peerDependencies"
원본 스크립트를 사용한 결과:
--------------------------
Checking dependencies...
UNUSED jquery
--------------------------
Checking devDependencies...
UNUSED @types/jquery
UNUSED @types/jqueryui
USED (1) autoprefixer
USED (1) awesome-typescript-loader
USED (1) cache-loader
USED (1) css-loader
USED (1) d3
USED (1) mini-css-extract-plugin
USED (1) postcss-loader
UNUSED sass
USED (1) sass-loader
USED (1) terser-webpack-plugin
UNUSED typescript
UNUSED webpack
UNUSED webpack-cli
USED (1) webpack-fix-style-only-entries
수정된 내용:
Checking dependencies...
USED (5) jquery
--------------------------
Checking devDependencies...
UNUSED @types/jquery
UNUSED @types/jqueryui
USED (1) autoprefixer
USED (1) awesome-typescript-loader
USED (1) cache-loader
USED (1) css-loader
USED (2) d3
USED (1) mini-css-extract-plugin
USED (1) postcss-loader
USED (3) sass
USED (1) sass-loader
USED (1) terser-webpack-plugin
USED (16) typescript
USED (16) webpack
USED (2) webpack-cli
USED (2) webpack-fix-style-only-entries
피스케벤은 다음과 같이 썼습니다.
단점은 패키지에서 패키지 이름을 추출하지 않는다는 것입니다.json과 그들을 확인합니다.각 패키지에 대해 직접 이 작업을 수행해야 합니다.
depcheck
제대로 작동하지 않습니다! (예: Typescript로 시도해보니 불필요한 구문 분석 오류가 발생했습니다.)
package.json
우리는 소프트웨어를 사용할 수 있습니다.아래 셸 스크립트를 시작하려면 디렉터리 이름이 필요합니다.
#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME
FILES=$(mktemp)
PACKAGES=$(mktemp)
find . \
-path ./node_modules -prune -or \
-path ./build -prune -or \
\( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES
function check {
cat package.json \
| jq "{} + .$1 | keys" \
| sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES
echo "--------------------------"
echo "Checking $1..."
while read PACKAGE
do
RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
if [ $RES = 0 ]
then
echo -e "UNUSED\t\t $PACKAGE"
else
echo -e "USED ($RES)\t $PACKAGE"
fi
done < $PACKAGES
}
check "dependencies"
check "devDependencies"
check "peerDependencies"
먼저 패키지 이름과 파일을 캐시할 수 있는 두 개의 임시 파일을 만듭니다.
은 다같다습니과로 합니다.find
첫 과 두 하게 만듭니다.node_modules
그리고.build
폴더(또는 원하는 대로)를 선택할 수 있습니다.세 번째 줄에는 허용된 확장자가 포함되어 있습니다. 여기에 JSX 또는 JSON 파일과 같은 파일을 추가할 수 있습니다.
함수는 종속 유형을 읽습니다.
은 ㅠㅠ!cat
package.json
.그리고나서,jq
필요한 종속성 그룹을 가져옵니다.({} +
예를 들어 파일에 피어 종속성이 없는 경우 오류를 발생시키지 않도록 하기 위한 것입니다.)
다음에 그이로후.sed
따옴표 사이의 부품, 즉 패키지 이름을 추출합니다. -n
그리고..../p
합니다.jq
의 JSON 출력. 다음 는 이 목록을 다우이패이목름읽습다니록을그지런키음리는으로 .while
루우프
RES
따옴표로 묶은 패키지 이름의 발생 횟수입니다.지은금입니다.import
/require
...'package'
/"package"
대부분의 경우에 효과가 있습니다.
그런 다음 결과 줄 수를 세고 결과를 인쇄합니다.
주의사항:
- 수 다가져기파찾일을수없다습니).
tsconfig.json
파일)lib
옵션) - 당신은 해야 합니다.
grep
에한해수동 ▁only로으에 한해^USED
그리고.UNUSED
files 파일 - 대규모 프로젝트의 경우 속도가 느립니다. 셸 스크립트의 확장성이 좋지 않은 경우가 많습니다.하지만 바라건대 당신은 이렇게 많이 뛰지 않을 것입니다.
계열 OS(리눅스, OSX 등)를 할 수 .find
그리고.egrep
패키지 이름이 포함된 요구 사항을 검색하려면 다음을 수행합니다.
find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;
▁▁for경 전체를 하면,require('name-of-package')
을 기억하세요: 올, 형따옴를사용야합니다해표문의식.
find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;
또는
find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;
는. 즉, 이에을지않습니다추하출서름패점키전히.package.json
그리고 그것들을 확인합니다.각 패키지에 대해 직접 이 작업을 수행해야 합니다. 때부터package.json
뿐입니다. JSON을 하는 작은 할 수 . 이것은 다음을 사용하는 작은 스크립트를 작성하여 해결할 수 있습니다.child_process.exec
각 종속성에 대해 이 명령을 실행합니다.그리고 그것을 모듈로 만듭니다.그리고 NPM 레포에 추가...
사용되지 않는 종속성, 라이브러리 및 가져오지 않은 파일 확인
npx unimported
Yarn 2.x 이상에서는 다음을 사용합니다.
yarn dlx depcheck
yarn dlx는 yarn 1.x와 함께 글로벌 패키지로 설치되었을 수 있는 스크립트 중 하나를 실행하도록 설계되었습니다. 시스템 전체 패키지 관리는 yarn의 범위 밖에 있습니다.이를 반영하여 yarn global이 제거되었습니다.
출처: https://yarnpkg.com/getting-started/migration#use-yarn-dlx-instead-of-yarn-global
이를 위해 아래의 npm 모듈을 사용할 수 있습니다.
https://www.npmjs.com/package/npm-check-unused
곰보와 nMo의 대본에 대해 제가 오해한 것이 아니라면요.nMo 스크립트 확장의 더 빠른 버전은 기본값이 'find'이지만 찾기 기능을 위해 'fd'를 사용하도록 쉽게 수정할 수 있습니다.
변경 사항은 먼저 모든 관련 파일을 찾은 다음 파일별 기반이 아닌 한 번에 모든 관련 파일에서 grep 패키지를 찾는 것입니다.
동시성은 제어할 수 있으며 기본값은 8입니다.
#!/bin/bash
DIRNAME=${1:-.}
cd "$DIRNAME"
FILES=$(mktemp)
PACKAGES=$(mktemp)
export NUMCONCURRENT=8
function findCmd {
startPath=${1:-.}
find "$startPath" \
-path ./node_modules -prune -or \
-path ./build -prune -or \
\( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print
}
# use fd
# https://github.com/sharkdp/fd
function findCmd_fd {
startPath=${1:-.}
fd -t f '(js|ts|json)$' "$startPath"
}
function check {
cat package.json \
| jq "{} + .$1 | keys" \
| sed -n 's/.*"\(.*\)".*/\1/p' > "$PACKAGES"
echo "--------------------------"
echo "Checking $1..."
findCmd > "$FILES"
while read PACKAGE
do
#echo "node_modules/${PACKAGE}"
if [ -d "node_modules/${PACKAGE}" ]; then
findCmd node_modules/${PACKAGE} >> $FILES
fi
done < $PACKAGES
export FILES
export SQ="'"
xargs -P ${NUMCONCURRENT:-1} -r -a "$PACKAGES" -I[] bash -c '
PACKAGE="[]"
RES=$(cat "$FILES" | xargs -r egrep -i "(import|require|loader|plugins|${PACKAGE}).*[\"${SQ}](${PACKAGE}|.?\d+)[\"${SQ}]" | wc -l)
if [ $RES = 0 ]
then
echo -e "UNUSED\t\t $PACKAGE"
else
echo -e "USED ($RES)\t $PACKAGE"
fi
'
[ -f "$PACKAGES" ] && rm "$PACKAGES"
[ -f "$FILES" ] && rm "$FILES"
}
check "dependencies"
check "devDependencies"
check "peerDependencies"
만약 당신이 어떤 거인의 어깨 위에 설 것인지를 선택하고 싶다면,
npm에서 사용할 수 있는 옵션의 짧은 목록을 생성하는 링크가 있습니다. 이 링크는 키워드를 필터링합니다.unused packages
https://www.npmjs.com/search?q=unused%20packages
왜 내 대답은 링크에 불과합니까?
일반적으로 링크만 제공하지 않습니다.이 질문은 시간에 덜 민감한 답변을 받을 가치가 있습니다.이 솔루션은 최신 소프트웨어에 의존합니다.유지 관리가 중단되었을 수 있는 특정 소프트웨어를 권장하는 것은 거의 도움이 되지 않습니다(여기 권장 사항 중 일부의 경우).사람들이 최신 정보를 찾을 수 있도록 돕는 것이 적절해 보입니다.
패키지 unused-package(https://www.npmjs.com/package/unused-package) 를 만들었습니다. 이 패키지는 사용되지 않은 패키지를 반환하거나 패키지가 devDependency이지만 일반적인 종속성으로 설치된 경우)
파일을 만들고 이 코드를 파일에 추가합니다.
const check = require("unused-package");
check({ entries: ['entry path to your code'] }).then((res) => {
console.log(res) // list of packages returned by library
});
used-package는 used-package와 비교하여 used-package의 장점 중 하나로, 패키지는 여러 엔트리 경로를 지원합니다.
언급URL : https://stackoverflow.com/questions/22675725/find-unused-npm-packages-in-package-json
'programing' 카테고리의 다른 글
클래스 [org.스프링 프레임워크]를 검사하지 못했습니다.security.config.config.confirmation.web.configuration.웹 보안 구성] (0) | 2023.07.01 |
---|---|
ggplot2의 주석에서 텍스트를 왼쪽 정렬하는 방법 (0) | 2023.07.01 |
Cython: "치명적 오류: numpy/array 개체.h: 해당 파일 또는 디렉토리가 없습니다." (0) | 2023.07.01 |
C# ASP.NET TLS를 통해 전자 메일 보내기 (0) | 2023.07.01 |
유형 스크립트로 프로젝트의 특정 디렉터리에서 가져오기 금지 (0) | 2023.06.26 |