Сохраняйте структуру src / folder при создании папки dist / с помощью Typescript 3

У меня есть сервер typecript nodejs с такой структурой:

tsconfig.json
package.json
src/
    middleware/
    utils/
    index.ts
dist/
    middleware/
    utils/
    index.js

При использовании Typescript 2 я смог перенести свой проект из src / в папку dist / и получить зеркальное отображение моей структуры каталогов для работы.

С выпуском Typescript 3 они представили ссылки на проекты и изменил способ преобразования кода в выходной каталог. Теперь tsc выводит в папку dist / вложенным образом следующим образом:

dist/
    src/
        middleware/
        utils/
        index.js

Мой tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "allowJs": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "resolveJsonModule": true,
    "declaration": false,
    "outDir": "dist/",
    "lib": [
      "es7",
      "dom"
    ]
  },
  "include": [
    "src/"
  ]
}

Как я могу настроить Typescript для вывода моей папки src / в виде зеркального изображения в папку dist /?


person nfadili    schedule 31.08.2018    source источник
comment
Спасибо! Удалим комментарии.   -  person Takeshi Tokugawa YD    schedule 08.06.2021


Ответы (6)


У меня была аналогичная проблема при первоначальном преобразовании в проект Typescript. Я также установил resolveJsonModule: true, и каталог src был скопирован в выходной каталог dist.

Основная причина в том, что один из моих исходных файлов required package.json находится в корне проекта. Как только я удалил это, tsc больше не добавлял src в каталог dist.

Короче говоря, убедитесь, что вам не нужны файлы вне каталога src.

Пояснительный FAQ здесь: https://github.com/Microsoft/TypeScript/wiki/FAQ#why-does---outdir-moves-output-after-adding-a-new-file

person Luke W    schedule 19.11.2019
comment
Оно работает! Но почему? Почему resolveJsonModule делает tsc вывод в /dist/src вместо /dist? В этом нет никакого смысла. - person s.meijer; 14.04.2020
comment
@ s.meijer, потому что он позволяет импортировать package.json (JsonModule), и это заставляет rootDir автоматически устанавливаться в каталог, содержащий весь источник (т.е. включая package.json), и теперь src dir больше не rootDir, а подкаталог , и так отражено в выводе. См. stackoverflow.com/a/61467483/8910547 для получения дополнительной информации и ссылок на то, что руководитель Typescript говорит об этом. - person Inigo; 30.04.2020
comment
Спасибо за это. он также дает тот же результат, когда вы хотите иметь такую ​​структуру, как ./src/ и ./typings, но не хотите, чтобы ./src в вашем ./dist ... короче говоря, если вы ссылаетесь на ./ введя ./src, он будет включен, поэтому ./src будет сохранен. T_T - person y_nk; 11.04.2021
comment
В моем случае это было "include": ["**/*.ts"] - ›"include": ["src/**/*.ts"] в tsconfig.json. - person Pavel Staselun; 25.05.2021

Само по себе обновление TypeScript 2 до 3 не должно было изменить поведения; Если мы сможем подтвердить, что это так, это может быть ошибкой. В любом случае убедитесь, что параметр компилятора rootDir указывает на ваш src каталог, а не на родительский каталог, потому что структура под rootDir зеркально отражается под outDir.

person Matt McCutchen    schedule 31.08.2018
comment
Я добавил свой tsconfig.json, чтобы прояснить ситуацию. Проект настраивается с использованием ключа "include" для указания каталога src /. Я только что подтвердил, что компилятор Typescript 2 просто отразит src / в dist / с этой конфигурацией, но компилятор Typescript 3 автоматически включит package.json и папку src /, вложенную в dist /. Попытки указать rootDir на src / терпят неудачу, потому что файла package.json там нет. - person nfadili; 03.09.2018
comment
Мне не удалось воспроизвести это поведение на основе предоставленной вами информации. Если вы можете опубликовать репозиторий, воспроизводящий проблему, я посмотрю. В противном случае я могу только предложить вам попробовать удалить что-то из своего проекта, пока проблема не исчезнет, ​​и тогда вы увидите, что ее вызывает. - person Matt McCutchen; 04.09.2018
comment
Я смог определить причину. Кажется, что добавление resolveJsonModule: true в мой tsconfig.json заставляло tsc выводить каталог dist / по-другому. Я до сих пор не совсем понимаю, почему он это делает, но, похоже, это тема для разговора в нескольких проблемах Github: github.com/Microsoft/TypeScript/issues/25216 и github.com/Microsoft/TypeScript/issues/24744 Спасибо за помощь, Мэтт! - person nfadili; 04.09.2018
comment
Это совсем не ясно из страницы параметров компилятора. - person trusktr; 09.02.2020

Структура каталога вывода контролируется rootDir из compilerOptions. См. документацию здесь, установка ./src должна решить проблему.

{
  "compilerOptions": {
    "rootDir": "src",
    ...
  },
  "include": [
    "src/"
  ]
}
person Morlo Mbakop    schedule 20.04.2020
comment
Фактически, в этом случае он просто поменяет местами проблемы. OP импортирует package.json, поэтому, если вы измените rootDir на src, вы получите правильную структуру outDir, но с ошибкой компиляции, потому что у вас есть исходный код за пределами rootDir. См. stackoverflow.com/a/61467483/8910547 для получения дополнительной информации и ссылок на то, что руководитель Typescript говорит об этом. - person Inigo; 30.04.2020
comment
использование rootDir решило проблему для меня с локальной .ts библиотекой, которую я импортировал - person Felipe; 05.06.2021

Помимо указания compilerOptions.outDir, укажите compilerOptions.rootDir в tsconfig.json.

{
  "compilerOptions": {
     // ...
    "outDir": "dist",
    "rootDir": "./",
    // ...
  }
}

Затем запустите: $ tsc -b внутри папки, в которой находится файл tsconfig.json.

person rplaurindo    schedule 07.04.2021

Проблема появляется после добавления resolveJsonModule: true в tsconfig.json

person Omega Cube    schedule 10.10.2019

вы можете изменить импорт файла из src / entity / Post - ›../entities/Post в файле в ./src

это изменяет импорт в папку dist.

person akash maurya    schedule 31.03.2021