Компилятор TypeScript: сгенерированные источники, корневые каталоги, исключения и символические ссылки

У меня есть эта настройка проекта TypeScript 2.0.3:

src/main/webapp/tsconfig.json
src/main/webapp/app -- contains .ts files
src/main/webapp/app/tsModels -- a symlink to ../../../../target/tsModels
target/tsModels/   -- contains .ts files

Цель состоит в том, чтобы target/tsModels скомпилировать файлы .ts.

Сначала с "rootDir": "." пожаловался tsc:

ошибка TS6059: файл '[...]/target/tsModels/AboutWindupModel.ts' не находится в 'rootDir' '[...]/src/main/webapp'. Ожидается, что «rootDir» будет содержать все исходные файлы.

Так что я попытался

{
  "compilerOptions": {  ...,
    //"rootDir": ".",
    "rootDirs": [".", "../../../target/tsModels"],
  },
} 

Все такой же. Пытался:

{
  "compilerOptions": {
    //"rootDir": ".",
    "rootDirs": [".", "../../../target/tsModels"],
  },
  "exclude": [
    "node_modules",
    "target/**",
    "../../../target/**", 
    "../../../target/**/*",
    "../../../target/tsModels/*", 
    "typings/main",
    "typings/main.d.ts"
  ]
}

Но все еще получаю эту ошибку.

Таким образом, кажется, что tsc не может правильно обрабатывать символические ссылки, всегда проверяет канонический путь.

Итак, я подумал, хорошо, давайте скомпилируем файлы tsModels напрямую. Поэтому я удалил символическую ссылку и попробовал:

  "compilerOptions": {
    //"rootDir": ".",
    "rootDirs": [".", "../../../target/tsModels"],
  },

Но на самом деле это не компилирует файлы в каталоге tsModels.
Я даже пробовал

    "rootDirs": "../../../target/tsModels",

но tsc не скомпилировал это, вместо этого он скомпилировал .. Он вообще этому подчиняется?

Что мне делать, чтобы скомпилировать файлы из обоих каталогов?
Есть ли способ использовать символическую ссылку, ведущую к каталогу за пределами rootDir?

Полный конфиг со всем мусором, который я пробовал:

{ "compilerOptions": { "target": "es5", "module": "system", "moduleResolution": "node", "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "removeComments": false, "noImplicitAny": false, //"rootDir": ".", //"rootDirs": [".", "../../../target/tsModels"], "rootDirs": ["../../../target/tsModels"], //"rootDir": "../../../target/tsModels", "outDir": "../../../target/windup-web", "sourceRoot": "/windup-web/" }, "exclude": [ "node_modules", //"target/**", //"../../../target/**", //"../../../target/**/*", //"../../../target/tsModels/*", //"target/tsModels/**", "typings/main", "typings/main.d.ts" ] }


person Ondra Žižka    schedule 18.10.2016    source источник


Ответы (1)


Я думаю, что опция компилятора preserveSymlinks может вам помочь:

Не разрешайте символические ссылки на их реальный путь; относитесь к файлу с символической ссылкой как к реальному.

https://www.typescriptlang.org/docs/handbook/compiler-options.html

Пример:

{
    "compilerOptions": {
        "preserveSymlinks": true
    }
}
person abcde    schedule 18.11.2018
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person Roman Pokrovskij; 18.11.2018
comment
Это не ответ только по ссылке. Важная информация - используйте опцию компилятора saveSymlinks - находится в тексте ответа. Ссылка сама по себе не отвечает на вопрос, это список всех параметров компилятора, и я добавил его только для справки. - person abcde; 18.11.2018
comment
И если вы считаете, что информации недостаточно, я добавил пример. - person abcde; 18.11.2018
comment
На самом деле я могу провалиться со своим обзором, это естественно. В SO несколько рецензентов должны согласиться, прежде чем принять решение. И рецензент, который ошибается, получает штрафы. Просто, на мой взгляд, ТАК - это система для создания контента, где ответ является единицей контента (а не веткой, как на других форумах). Ответ должен быть интересной историей :) не беспокойтесь сильно, если я потерпел неудачу - другие рецензенты/модераторы просматривают меня :), как это работает. - person Roman Pokrovskij; 18.11.2018