使用打字稿2.9,我能够成功导入本地package.json文件并使用这些值。但是,当我只希望生成的JS文件使用实际的package.json时,我现在遇到了将package.json文件包含在编译输出中的问题。
我的包裹中包含以下文件:
src/
index.ts
package.json
tsconfig.json
我的index.ts导入package.json:
import pkg = require("../package.json");
我的tsconfig.json看起来像这样:
{
"compilerOptions": {
"outDir": "./lib",
"module": "commonjs",
"resolveJsonModule": true,
"esModuleInterop": true
},
"include": [
"src/**/*"
]
}
理想情况下,结果将是:
lib/
index.js
package.json
但是我实际上得到的是:
lib/
src/
index.js
package.json
package.json
答案 0 :(得分:2)
我正在使用TypeScript 3.5.1,如果我使用require()
函数导入package.json,则不会将其复制到编译输出中,因此输出看起来像是理想的结果。
我的tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"lib": ["es2015", "dom"],
"sourceMap": true,
"strict": true,
"moduleResolution": "node",
"downlevelIteration": true
"outDir": "./ts-out",
"noImplicitAny": false,
"suppressImplicitAnyIndexErrors": false
},
"include": [
"./src"
]
}
我只是这样导入它:
const pkg = require('../package.json');
我已经在Facebook的Jest框架源代码(他们正在使用Lerna + TypeScript)中找到此解决方案:https://github.com/facebook/jest/blob/master/packages/jest-core/src/version.ts
答案 1 :(得分:1)
如果您的src文件的结构是当我只希望生成的JS文件使用实际的package.json时。
您的lib
始终是纯文本。如果将package.json
包含在TypeScript编译上下文中,则它将把lib更改为package.json + src
。
如何将package.json导入Typescript文件而不将其包含在编译输出中?
如果导入,则不能。
答案 2 :(得分:1)
您想要一些矛盾的事情:
package.json
,这意味着您将其视为源outDir
如果您在逻辑上将您的项目分解为单独的子项目,那么这些矛盾就不会矛盾。您将需要Typescript 3的新Project References功能。
我们将src
目录和包含package.json
的根目录视为单独的项目。每个文件都有自己的tsconfig
文件:
将src
目录提供给自己的项目。
./src/tsconfig.json
:
{
"compilerOptions": {
"rootDir": ".",
"outDir": "../lib/",
"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.
]
}
由于根子项目的输出是相同目录,并且由于package.json
的源路径和输出路径最终相同,所以tsc
不会做任何事情... 。实际上是无人操作。
运行tsc --build src
,瞧瞧!结果将是:
lib/
index.js
package.json
答案 3 :(得分:0)
在rootDir
内设置tsconfig
选项,如下所示
"compilerOptions": {
"rootDir": "./src"
}`
答案 4 :(得分:0)
指定 compilerOptions.moduleResolution
、compilerOptions.resolveJsonModule
和 include
,如下所示。
{
"compilerOptions": {
// ...
"moduleResolution": "node",
"resolveJsonModule": true
// ...
},
"include": [
"./src",
"package.json"
]
}
然后在 tsconfig.json 文件所在的文件夹中运行 $ tsc -b
,假设 package.json
文件与 tsconfig.json
位于同一路径