Подтвердить что ты не робот

Настройка tsconfig со спецификацией/тестовой папкой

Скажем, я поместил свой код под src и проверил в spec:

+ spec
+ --- classA.spec.ts
+ src
+ --- classA.ts
+ --- classB.ts
+ --- index.ts
+ tsconfig.json

Я хочу только переместить src в папку dist. Поскольку index.ts является точкой входа моего пакета, мой tsconfig.json выглядит следующим образом:

{
  "compileOptions": {
    "module": "commonjs"
    "outDir": "dist"
  },
  "files": {
    "src/index.ts",
    "typings/main.d.ts"
  }
}

Однако этот tsconfig.json не включает тестовые файлы, поэтому я не могу разрешать в них зависимости.

С другой стороны, если я включаю тестовые файлы в tsconfig.json, то они также передаются в папку dist.

Как решить эту проблему?

4b9b3361

Ответ 1

В итоге я определил несколько файлов конфигурации и использовал extends, чтобы упростить их.

Скажем, у меня есть два файла: tsconfig.json и tsconfig.build.json

// tsconfig.json
{
  ...
  "exclude": [...]
}

// tsconfig.build.json
{
  ...
  "files": [ "typings/index.d.ts", "src/index.ts" ]
}

Таким образом, я могу точно контролировать, что строить (используя tsc -p tsconfig.build.json) и то, что обрабатывает ts language service (IDE).

UPDATE: теперь, когда мои проекты растут, у меня появилось больше конфигурационных файлов. Я использую функцию "расширения", которая теперь доступна в TypeScript:

// tsconfig.base.json
{
  // your common settings. Mostly "compilerOptions".
  // Do not include "files" and "include" here,
  // let individual config handles that.
  // You can use "exclude" here, but with "include",
  // It pretty much not necessary.
}

// tsconfig.json
{
  // This is used by `ts language service` and testing.
  // Includes source and test files.
  "extends": "./tsconfig.base.json",
  "atom": { ... },
  "compilerOptions": {
    // I set outDir to place all test build in one place,
    // and avoid accidentally running `tsc` littering test build to my `src` folder.
    "outDir": "out/spec"  
  }
  "include": [ ... ]
}

// tsconfig.commonjs.json or tsconfig.systemjs.json or tsconfig.global.json etc
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    // for some build this does not apply
    "declaration": true/false,
    "outDir": "dist/<cjs, sys, global, etc>",
    "sourceRoot": "..."
  },
  // Only point to typings and the start of your source, e.g. `src/index.ts`
  "files": [ ... ],
  "include": [ ... ]
 }

Ответ 2

Это в некоторой степени зависит от того, какую среду тестирования вы используете, но мне нравится использовать ts-node для компиляции моих тестовых файлов. Используя mocha, ваш скрипт npm test может выглядеть так:

"mocha": "mocha test/ --compilers ts:ts-node/register --recursive"

В вашем файле tsconfig.json обязательно удалите опцию rootDir.

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "noImplicitAny": false,
        "removeComments": true,
        "sourceMap": true,
        "outDir": "lib"
    },
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules",
        "lib",
        "typings/**"
    ]
}

Когда вы пытаетесь запустить машинописный текст с rootDir, установленным на src, или любой другой базовой папкой для кода вашего приложения, он запрещает любую компиляцию в каталоге, который находится снаружи, например, tests. Используя ts-node, вы можете легко хранить все отдельно, без необходимости иметь отдельные файлы конфигурации TypeScript.

Ответ 3

Я думаю, вы не должны использовать опцию "файлы" в своей конфигурации. Вместо этого вы можете исключить ненужные файлы и сделать это следующим образом:

{ 
    "compilerOptions": { 
        "module": "commonjs", 
        "outDir": "dist"
    },
    "exclude": [
        "node_modules",
        "dist",
        "typings/browser.d.ts",
        "typings/browser/**"
    ]
} 

Это сохранит вашу исходную структуру в папке "dist" без смешивания тестов и файлов приложений js:

--dist
----spec
-------....
----src
-------....