javascript - tsx ไม่สามารถหาตำแหน่งโฟลเดอร์ได้
ฉันกำลังใช้ Node 19 และมีไลบรารีขนาดเล็กที่ใช้ TypeScript และตัวทดสอบในตัว ตามความคิดเห็นในปัญหา Github นี้ ฉันกำลังพยายามทดสอบไฟล์ .ts
tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"declaration": true,
"esModuleInterop": true,
"lib": ["es2022", "dom"],
"module": "commonjs",
"outDir": "build",
"resolveJsonModule": true,
"strict": true,
"target": "es2022"
},
"include": ["./**/*.ts"],
"exclude": ["./build"]
}
package.json
{
"scripts": {
"test": "tsc --noEmit && node --loader tsx --test test/**/*Tests.ts"
},
"dependencies": {
"@types/node": "18.11.9"
},
"devDependencies": {
"tsx": "3.11.0",
"typescript": "4.8.4"
}
}
./test/someTests.ts
import assert from 'assert/strict';
import { describe, it } from 'node:test';
describe('tests', () => {
it('passes', () => {
assert.ok(true);
});
});
เมื่อรัน npm run test ฉันได้รับข้อผิดพลาด
ไม่พบ '/home/.../repository/test/**/*Tests.ts'
มีใครรู้ไหมว่ามีอะไรผิดปกติ?
คำตอบ #1
แก้ไข :
ดูโครงการตัวอย่างนี้ซึ่งฉันได้สร้างขึ้น
ปัญหา
ฉันยังไม่ได้ทดสอบสภาพแวดล้อมของคุณ แต่ถ้าฉันต้องเดา ฉันเชื่อว่ามันคือสคริปต์ npm ของคุณที่ไม่ถูกต้อง:
tsc --noEmit && node --loader tsx --test test/**/*Tests.ts
บนระบบ POSIX npm จะรันสคริปต์ด้วย /bin/sh รูปแบบ test/**/*Tests.ts จะไม่ถูกขยายโดย node หรือ npm การขยายขึ้นอยู่กับ /bin/sh อย่างไรก็ตาม ** ซึ่งเป็นที่รู้จักในชื่อ globstar ไม่ได้รับการสนับสนุนโดย /bin/sh จึงไม่ได้ถูกขยายตามที่คาดไว้ globstar จะได้รับการสนับสนุนโดย /bin/bash แต่ต้องเปิดใช้งาน
วิธีแก้ปัญหา
ฉันอาจจะผิด แต่ฉันเชื่อว่าเนื่องจาก globstar ไม่สนับสนุน รูปแบบ test/**/*Tests.ts จะกลายเป็น test/*/*Tests.ts ซึ่งจะตรงกับไฟล์เฉพาะในไดเรกทอรีย่อยของโฟลเดอร์ test ของคุณ เช่น test/abc/xyzTests.ts หากคุณต้องการเพียงตรงกับการทดสอบในรากของโฟลเดอร์ test คุณสามารถเขียนรูปแบบใหม่เป็น test/*Tests.ts ซึ่งจะตรงกับ tests/xyzTests.ts แต่จะไม่ตรงกับไฟล์ในไดเรกทอรีย่อยของโฟลเดอร์ test ของคุณ
ทางออกที่ดีกว่า
จะดีกว่าถ้าเขียนสคริปต์ใหม่ในลักษณะที่สามารถใช้งานข้ามแพลตฟอร์มได้ แทนที่จะพึ่งพาคุณสมบัติที่ขึ้นกับแพลตฟอร์มในสคริปต์ของคุณซึ่งอาจไม่เชื่อถือได้ ด้วยวิธีนี้สคริปต์ของคุณน่าจะสามารถทำงานบนวินโดวส์ได้ด้วย
อาจมีวิธีที่ง่ายกว่าที่จะใช้แพ็กเกจอื่น แต่ฉันคิดว่าฉันคงแค่ย้ายมันไปยังสคริปต์ JavaScript หรือ TypeScript
เปลี่ยนสคริปต์ของคุณเป็น:
tsc --noEmit && node --loader tsx runTests.ts
จากนั้นสร้างไฟล์ชื่อ runTests.ts
ฉันไม่มีเวลามาลองสคริปต์เต็มๆ แต่ฉันคาดว่าคุณคงต้องการใช้แพ็กเกจ glob เพื่อดึงรายการไฟล์ และใช้ Node API child_process เพื่อเรียก node --loader tsx --test ...
ที่เกี่ยวข้อง
ทำไมจึงไม่สามารถใช้ ** (สำหรับการค้นหาซ้ำ) ในสคริปต์ npm package.json ได้ ถ้ามันใช้ได้ใน 'npm shell'?
ทำไมคุณควรใส่เครื่องหมายคำพูดรอบ ๆ globs ของคุณในสคริปต์ NPM อยู่เสมอ
