Настройка tsconfig с папкой spec / test

Скажем, я поместил свой код в 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.

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


person unional    schedule 18.02.2016    source источник
comment
Аналогичный вопрос и рабочий (довольно элегантный) ответ здесь: stackoverflow.com/a/61153019/3082178.   -  person AKd    schedule 19.11.2020


Ответы (5)


Я закончил тем, что определил несколько файлов конфигурации и использовал 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).

ОБНОВЛЕНИЕ: теперь, когда мои проекты растут, у меня появилось больше файлов конфигурации. Я использую функцию «расширения», которая теперь доступна в 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's 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": [ ... ]
 }
person unional    schedule 31.05.2016
comment
Теперь, возможно, стоит использовать функцию Ссылки проекта на Typescript 3, поскольку описано в stackoverflow.com/questions/51631786/ - person Jedateach; 08.03.2020
comment
Это больше для референции проектов монорепозитория. Я использую его в своих монорепозиториях, таких как github.com/unional/standard-log - person unional; 08.03.2020

Вот подробное решение для управления источниками и тестами:

  • компиляция включает исходники и тестовые папки / файлы
  • сборка включает только исходники
  • IDE (VSCode, ...)

Конфиг

Решение основано на 2 tsconfig.json файлах, как упоминалось в других ответах.

Основной ./tsconfig.json (используется для компиляции и IDE):

{
  "compileOptions": {
    "module": "commonjs"
    "outDir": "dist"
  },
  "include": [
    "spec/**/*. spec.ts"
  ],
  "files": {
    "src/index.ts",
  }
}

Второй ./tsconfig-build.json (используется для сборки):

{
  "extends": "./tsconfig.json",
  "exclude": [
    "spec/**/*. spec.ts"
  ]
}

Примечание: мы исключаем тестовые файлы, которые были включены ранее

Строить

Команда сборки: tsc -p tsconfig-build.json

Или npm run build, если скрипт добавлен в package.json:

{
  "scripts": {
    "build": "tsc -p tsconfig-build.json",
}

person user1067920    schedule 14.02.2020

Это в некоторой степени зависит от того, какую среду тестирования вы используете, но мне нравится использовать ts-node для компилировать мои тестовые файлы. При использовании мокко ваш 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.

person barndog    schedule 11.12.2016
comment
Отсутствие разделения на несколько файлов конфигурации имеет недостаток, заключающийся в распределении дополнительных (тестовых) файлов в пакете. Кроме того, ваши два include избыточны. Вам нужно только src/**/*.ts - person unional; 12.12.2016

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

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

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

--dist
----spec
-------....
----src
-------....
person Amid    schedule 18.02.2016
comment
Но он вообще не хочет, чтобы тестовые файлы попадали в dist папку . Что логично, они не для публикации. Их наличие в подкаталоге особо не помогает. Я тоже хочу, чтобы файлы моего проекта попадали в lib/, а файлы в test/ оставались там, где они есть. Если .js-версия тестовых файлов будет перемещена в другое место, у меня возникнут две новые проблемы: а) исключить их из публикации, б) их найдут исполнители тестов, конечно, решаемые, но они накапливают взлом вершина взлома. Необязательно, если tsc может просто хранить тестовые файлы в тестовом каталоге. - person Mörre; 07.05.2019

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

{
  "include": [ "src/**/*" ],
  "exclude": [ "./spec" ]
}
person Clayton Selby    schedule 02.04.2021
comment
Разрешит ли эта настройка intellisense и рефакторинг в VSCode? - person AKd; 04.04.2021
comment
Вам нужно будет обновлять этот файл tsconfig вручную, когда вы выполняете большие рефакторинги (изменяя исходную папку или где находятся ваши спецификации). Для обнаружения этих изменений может быть плагин VSCode, но я в этом сомневаюсь. - person Clayton Selby; 05.04.2021