package.json 파일에 더 이상 필요하지 않은 패키지가 있는지 확인하는 방법이 있습니까?
예를 들어 패키지를 시험 해보고 나중에 주석을 달거나 코드를 삭제하지만 제거를 잊어 버린 경우 삭제할 수있는 몇 가지 패키지가 생깁니다.
패키지를 안전하게 삭제할 수 있는지 확인하는 효율적인 방법은 무엇입니까?
답변
depcheck 라는 npm 모듈을 사용할 수 있습니다 (노드 버전 10 이상 필요).
-
모듈을 설치하십시오 :
npm install depcheck -g or yarn global add depcheck
-
이를 실행하고 사용하지 않는 종속성을 찾으십시오.
depcheck
이 방법의 좋은 점은 find
또는 grep
명령 을 기억할 필요가 없다는 것 입니다.
설치하지 않고 실행하려면 npx 를 사용하십시오.
npx depcheck
답변
다음과 같은 패키지도 있습니다 npm-check
.
npm-check
오래되고 부정확하며 사용되지 않는 종속성을 확인하십시오.
그것은 매우 강력하고 적극적으로 개발되었습니다. 사용되지 않는 종속성을 확인하는 기능 중 하나입니다.이 부분에서는depcheck
다른 답변에서 언급 한 모듈을 .
답변
당신은 다음의 조합을 사용할 수 있습니다 (등 리눅스, OSX) OS와 같은 유닉스를 사용하는 경우 find
와 egrep
패키지 이름을 포함하는 문을 필요로를 검색 :
find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;
전체 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 저장소에 추가하십시오 …
답변
fiskeben은 다음과 같이 썼습니다.
단점은 완전 자동적이지 않다는 것입니다. 즉 package.json에서 패키지 이름을 추출하여 확인하지 않습니다. 각 패키지마다이 작업을 수행해야합니다.
어떤 이유로 든 Fiskeben의 답변을 자동화하십시오 depcheck
제대로 작동하지 않는 ! (예를 들어 Typescript로 시도했지만 불필요한 구문 분석 오류가 발생했습니다)
구문 분석 package.json
을 위해 소프트웨어를 사용할 수 있습니다 jq
. 아래 셸 스크립트에는 시작할 디렉토리 이름이 필요합니다.
#!/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
의 S package.json
. 그런 다음 jq
필요한 종속성 그룹을 가져옵니다. ( {} +
예 : 파일에 피어 종속성이없는 경우 오류가 발생하지 않도록하십시오.)
그런 sed
다음 패키지 이름 인 따옴표 사이의 부분을 추출합니다. -n
와 .../p
일치하는 부품에서 아무것도 인쇄를 지시 jq
의 JSON 출력을. 그런 다음이 패키지 이름 목록을 while
루프 로 읽습니다 .
RES
패키지 이름이 따옴표로 표시되는 횟수입니다. 지금 당장이야 import
/ require
… 'package'
/"package"
입니다. 대부분의 경우 작업을 수행합니다.
그런 다음 결과 줄 수를 세고 결과를 인쇄합니다.
주의 사항 :
- 다른 가져 오기에서 파일을 찾을 수 없습니다
tsconfig.json
( 예 : 파일lib
) - 당신은에있는
grep
경우에만 수동^USED
및UNUSED
파일. - 대규모 프로젝트의 경우 속도가 느립니다. 셸 스크립트는 종종 확장 성이 떨어집니다. 그러나 희망적으로 당신은 이것을 여러 번 실행하지 않을 것입니다.
답변
이 목적으로 아래 npm 모듈을 사용할 수 있습니다.
답변
여기에 많은 대답이 사용되지 않은 항목을 찾는 방법입니다.
나는 그들을 자동으로 제거하고 싶었다 .
-
이 노드 프로젝트를 설치하십시오.
$ npm install -g typescript tslint tslint-etc
-
루트 디렉토리에서 새 파일 tslint-imports.json을 추가하십시오.
{
"extends": [
"tslint-etc"
],
"rules": {
"no-unused-declaration": true
}
}
-
위험 부담으로 실행하고 백업하십시오 🙂
$ tslint --config tslint-imports.json --fix --project .