fiskeben wrote:
ข้อเสียคือมันไม่ได้ทำงานโดยอัตโนมัตินั่นคือไม่ได้แยกชื่อแพ็คเกจจาก 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
- มันช้าสำหรับโครงการขนาดใหญ่ - เชลล์สคริปต์มักจะขยายขนาดไม่ได้ แต่หวังว่าคุณจะไม่ทำงานหลายครั้ง