我使用project references从“前”和“后”项目中引用“共享”项目。
tsc -v: Version 3.3.3
项目结构:
./{MY_PROJECT}.code-workspace /* the only file in this level */
./back
./back/tsconfig.json
./shared/src/
./shared/
./shared/tsconfig.json
./shared/src/
./front
./front/tsconfig.json
./front/src
我正打算从共享项目中将模块导入./front/src/article-view-model.ts
:
import Article from "@shared/src/article"; // alias path
import Article from "../../shared/src/article"; // full relative path
export default class ArticleViewModel {
}
VS Code GUI中立即显示以下错误:
对于别名路径:
找不到模块'@ shared / src / article'。 ts(2307)
有关完整的相对路径:
尚未从源文件“ c:/ {SOMEWHERE_IN_MY_PC} /shared/src/article.ts”构建输出文件“ ../../shared/src/article”。 ts(6305)
Intellisense(VS代码)确实适用于别名和相对选项:
如果我尝试忽略错误并构建,它将失败:
C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:1296 抛出e; ^
错误:调试失败。错误的表达。 在mergeSymbol(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25861:26) 在C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25960:47 在Map.forEach() 在mergeSymbolTable(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25958:20) 在initializeTypeChecker(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:48653:21) 在Object.createTypeChecker(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25711:9) 在getDiagnosticsProducingTypeChecker(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:71398:93) 在Object.getGlobalDiagnostics(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:71755:72) 在Object.getGlobalDiagnostics(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:73528:86) 在buildSingleProject(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:75803:127)
./ front / tsconfig.json内容:
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"baseUrl": ".",
"module": "amd",
"noEmitOnError": true,
"noImplicitAny": false,
"out": "./lib/front-bundle.js",
"paths": {"@shared/*" : ["../shared/*"]},
"preserveConstEnums": true,
"removeComments": true,
"sourceMap": true,
"target": "es2015",
"watch": true
},
"include": [
"./src/**/*.ts",
],
"references": [
{
"path": "../shared"
}
]
}
./ shared / tsconfig.json内容:
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"composite": true,
"declaration": true,
"module": "amd",
"noEmitOnError": true,
"noImplicitAny": false,
"out": "./lib/shared-bundle.js",
"preserveConstEnums": true,
"removeComments": true,
"sourceMap": true,
"target": "es2015",
"watch": true
},
"include": [
"./src/**/*.ts",
]
}
答案 0 :(得分:2)
我来到这里试图解决“不是从源文件构建的”错误。原来tsc
监视进程未正确退出,因此我有两个实例在争夺文件。万一其他人遇到同样的问题?
答案 1 :(得分:1)
如果在包含tsconfig.json
,front
和{{1}的目录中有错误的back
,我可以重现您得到的错误}}。在这种情况下,运行shared
将在当前目录中拾取错误的tsc -b
,并且由于它没有配置正确的tsconfig.json
或其他任何内容,因此编译失败并出现与您相同的错误
否则,如果我使用您的文件并发出paths
而不是tsc -b front
,则它将编译而没有错误。
VSCode不会遇到麻烦的原因是,为了提供完成功能,TypeScript编辑器(通常)使用TypeScript提供的名为tsc -b
的工具。当编辑者提供tsserver
的文件路径时,tsserver
通过在包含源文件的目录中查找,然后在父目录中查找,以得到相关的tsserver
,依此类推。 ,直到找到tsconfig.json
文件。因此,当VSCode在tsconfig.json
上运行并要求front/src/foo.ts
提供补全时,tsserver
在没有匹配文件的tsserver
中查找,然后在front/src
中查找front
。
答案 2 :(得分:0)
这完全不能直接回答您的问题,但是我觉得提供替代方法可能仍然有用。
以“更标准”的方式解决此问题的一种方法是使您的3个代码库全部为NPM软件包。
这样,您的导入将类似于@vendor/shared/foo
,而不是../../../../shared/src/article
。
使用npm link
可以很容易地进行项目的交叉依赖。
从技术上讲,您甚至不需要修改源代码结构(尽管您可能想要)。 shared
依赖项仅通过node_modules
进行软链接。
答案 3 :(得分:0)
如果要从根文件夹进行编译,请尝试添加具有所有tsconfig.json
设置即references
的本地references: { path: './shared' }
文件。否则,tsc将找不到要构建的相关项目。
此外,没有根tsconfig.json
将会不允许VSCode GUI在寻找根tsconfig.json
时正常工作(这是我上次检查它的状态,在这里您可以找到related issue)。
该错误似乎与文件丢失有关。如果您可以提供有关构建步骤的更多详细信息,我可以尝试对其进行更好地检查
答案 4 :(得分:0)
在我上一次活动之后,我几乎没有解决它,但是由于以下更改,我不确定100%是否发生了。无论如何,我还是在这里发布它,因为仍然有新的观点和投票,因此对其他人来说可能很有价值:
那是变化:
在 ./ shared / tsconfig.json内容中:代替:
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"composite": true,
"declaration": true,
"module": "amd",
"noEmitOnError": true,
"noImplicitAny": false,
"out": "./lib/shared-bundle.js", <-------------
"preserveConstEnums": true,
"removeComments": true,
"sourceMap": true,
"target": "es2015",
"watch": true
},
"include": [
"./src/**/*.ts",
]
}
使用:
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"composite": true,
"declaration": true,
"module": "amd",
"noEmitOnError": true,
"noImplicitAny": false,
"outDir": "./lib/", <-------------
"preserveConstEnums": true,
"removeComments": true,
"rootDir": "./src", <-------------
"sourceMap": true,
"target": "es2015",
"watch": true
},
"include": [
"./src/**/*.ts",
]
}