- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在我的 TypeScript 应用程序中导入 package.json
:
import packageJson from '../package.json';
我的 tsconfig.json
包含以下内容:
{
"compilerOptions": {
"rootDir": "./src/"
"outDir": "./dist/",
"baseUrl": ".",
"resolveJsonModule": true
}
}
问题是当我编译这个的时候,我得到了
error TS6059: File '/path/to/package.json' is not under 'rootDir' '/path/to/app/src/'. 'rootDir' is expected to contain all source files.
我不确定我是否理解这个问题,因为 ./src/
和 /.dist
具有相同的父级 ..
,因此 TypeScript 可以不理会 import '../package.json'
并且 它可以从 rootDir
或 outDir 中工作
。
无论如何,我已经尝试了以下方法,但结果并不令人满意:
rootDir
- 编译有效,但 dist
将包含 dist/src
,这是我不想要的outDir
- 然后 src
被 .js
文件(和 .js.map
污染,如果 sourceMap
是真的)@ts-ignore
- 编译停止导入 ../package.json
此限制的解决方法是什么,将生成的文件保存在 dist
中,并允许从 rootDir
的父目录导入?
最佳答案
这是可能的,事实证明,不难。
解决方案不明显的原因是因为 typescript 依赖于 rootDir
来决定输出的目录结构(参见 this comment from Typescript's bossman ),并且只包含代码可以导入输出或包依赖项。
rootDir
设置为项目的根目录,package.json
将发送到 outDir
的根目录并可以导入。但是随后您编译的 src
文件将写入 outDir/src
。rootDir
设置为src
,那里的文件将编译到outDir
的根目录。但是现在the compiler won't have a place to emit package.json
,所以它发出“一个错误,因为项目似乎配置错误”(老板的话)。Typescript 项目 由tsconfig 文件定义,是独立的,并且有效地 受其rootDir< 限制
。这是一件非常好的事情,因为它符合封装原则。
您可以有多个项目(例如,一个主项目和一组库),每个项目都在它们自己的目录中,并且有它们自己的 tsconfig。它们之间的依赖关系使用 Typescript 在 tsconfig 文件中声明 Project References .
I admit, the term "projects" is a poor one, as intuitively it refers to the whole shebang, but "modules" and "packages" are already taken in this context. Think of them as "subprojects" and it will make more sense.
我们会将 src
目录和包含 package.json
的根目录视为单独的项目。每个都有自己的 tsconfig
文件。
为 src
目录提供自己的项目。
./src/tsconfig.json
:
{
"compilerOptions": {
"rootDir": ".",
"outDir": "../dist/",
"resolveJsonModule": true
},
"references": [ // this is how we declare a dependency from
{ "path": "../" } // this project to the one at the root dir`
]
}
给根目录它自己的项目。
./tsconfig.json
:
{
"compilerOptions": {
"rootDir": ".",
"outDir": ".", // if out path for a file is same as its src path, nothing will be emitted
"resolveJsonModule": true,
"composite": true // required on the dependency project for references to work
},
"files": [ // by whitelisting the files to include, TS won't automatically
"package.json" // include all source below root, which is the default.
]
}
运行 tsc --build src
瞧瞧!
这将构建src
项目。因为它声明了对根项目的引用,所以它也会构建那个项目,但前提是它已过时。因为根 tsconfig 与 outDir
具有相同的目录,所以 tsc 将不会对 package.json
做任何事情,它被配置为编译的一个文件。
您可以通过将模块/库/子项目放在它们自己的子目录中并为它们提供自己的 tsconfig 来隔离模块/库/子项目。
您可以使用 Project References 显式管理依赖项,以及模块化构建:
来自链接文档:
您可以大大缩短构建时间
A long-awaited feature is smart incremental builds for TypeScript projects. In 3.0 you can use the
--build
flag withtsc
. This is effectively a new entry point fortsc
that behaves more like a build orchestrator than a simple compiler.Running
tsc --build
(tsc -b
for short) will do the following:
- Find all referenced projects
- Detect if they are up-to-date
- Build out-of-date projects in the correct order
Don’t worry about ordering the files you pass on the commandline -
tsc
will re-order them if needed so that dependencies are always built first.
强制组件之间的逻辑分离
以新的更好的方式组织您的代码。
这也很简单:
用于共享选项和构建所有内容的根 tsconfig
使用简单的 tsc --build
命令创建子项目(使用 --force
从头开始构建它们)
src/tsconfig.json
{
"compilerOptions": {
"outDir": ".", // prevents this tsconfig from compiling any files
// we want subprojects to inherit these options:
"target": "ES2019",
"module": "es2020",
"strict": true,
...
},
// configure this project to build all of the following:
"references": [
{ "path": "./common" }
{ "path": "./projectA" }
]
}
一个“公共(public)”库被阻止从其他子项目,因为它没有项目引用
src/common/tsconfig.json
{
"extends": "../tsconfig.json", //inherit from root tsconfig
// but override these:
"compilerOptions": {
"rootDir": ".",
"outDir": "../../build/common",
"resolveJsonModule": true,
"composite": true
}
}
一个子项目可以导入 common 因为声明了引用。src/projectA/tsconfig.json
{
"extends": "../tsconfig.json", //inherit from root tsconfig
// but override these:
"compilerOptions": {
"rootDir": ".",
"outDir": "../../build/libA",
"resolveJsonModule": true,
"composite": true
},
"references": [
{ "path": "../common" }
]
}
关于javascript - 'package.json' 不在 'rootDir' 之下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753163/
我收到了这个相当无意义的 tsc 编译错误: error TS6059: File '/Users/alex/codes/interos/teros-cli/src/logging.ts' is no
这是我第一次使用 sanity,我遇到了这个问题,在运行 expo start 时,如果你能帮助我,我将非常感谢 jest-haste-map: Haste module naming collisi
我们正在使用 Visual Studio 2017 并且有两个独立的 Web 项目,它们应该共享一些用 TypeScript 编写的 React 组件。还可以共享 JavaScript 文件和 CSS
我正在学习使用Hbase,并对hbase.rootdir的配置感到困惑。 namenode(active)在服务器hd1上。 namenode(standby)位于服务器hd2上。 问题是: 我必须配
我有一个 Angular CLI 工作区,其中包含两个库项目,foo 和 bar。当我构建两个库中的第二个库 foo 时,构建失败并出现以下错误: error TS6059: File '/code/
$rootDir/gradle目录用于什么(不是.gradle)?在构建期间,默认情况下是否从该目录中读取任何内容?是否有关于该目录中应包含哪些内容的约定? 最佳答案 好吧,gradle目录用于存储G
我有一个具有以下目录结构的项目: . .. core/start.py tests/test_curve.py pytest.ini pytest.ini的内容是: [pytest] testpath
我在 HDFS 上针对 hbase 表中存在的数据运行 map reduce 作业。当我在玩配置时,我观察到了这一点。 conf.set( "hbase.rootdir", "hdfs://" + h
我正在尝试使用如下所示的任务将文件复制到 rootDir... task copyFilesToProjectRoot(type: Copy) { from (fileTree(dir: *s
我在 public 下有一张图片文件夹。 如何在 symfony4 中获取我的图像目录? 在 symfony 3 中,它相当于: $webPath = $this->get('kernel')->ge
我有一个包含一些组件的大型仓库。 \my_repo |--modul1 |--modul2 |--modul3 |--modul4 |--modul5 |--modul6 ... 当我想使用使用另一个
我正在尝试将 TypeScript 与 React Native 结合使用。 这是我的tsconfig.json: { "compilerOptions": { "target
我看到 this问题,但它略有不同,没有答案 我有几个 git 子模块。它们是现有的大型项目,我认为我可以直接重用其中的部分,例如: myproject/ src/ submod1/src
我正在开发我的第一个 Angular 7 库,但是在尝试编译该库时出现此错误。 错误:错误 TS6059:文件 '...environment.ts' 不在 'rootDir' 'my-angular
在我的 Grails 项目中,我使用 elfinder 插件来管理文件和目录。我想要一个动态的根目录,因为我将插件用于不同的文件夹。 目录路径如下: grails.plugin.elfinder.ro
我正在尝试在我的 TypeScript 应用程序中导入 package.json: import packageJson from '../package.json'; 我的 tsconfig.jso
我需要在 Next.js 应用程序的上下文中合并 Cypress 覆盖率报告和 Jest 覆盖率报告。 Jest 会将文件列为 my-app/src/whatever。 Cypress 仅显示 src
tyescript 中的 rootDir 和 baseUrl 有什么区别? 根据 ts 文档 基本网址 Base directory to resolve non-relative module na
我遇到了一个错误,我需要你的帮助。感谢观看这个问题。 我的情况:我正在为我的项目配置 Drone CI 工具,当我运行 时我得到了这个在drone.yml 上进行单元测试 . Validation E
我正在尝试根据 apache 网站上的设置以伪分布式模式运行 HBase,但我无法正确配置 hbase.root 目录。 这是我的配置文件的样子: 在 Hadoop 目录中: conf/core-si
我是一名优秀的程序员,十分优秀!