ค้นหาเว็บไซต์

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 อยู่เสมอ

บทความที่เกี่ยวข้อง