如何从我的软件包用户的import语句中删除输出文件夹?

时间:2019-09-27 08:32:08

标签: node.js typescript npm node-modules

我有一个基于Typescript的项目,其中包含多个.d.ts文件,我希望将这些文件导出为npm包并在另一个项目中使用。

在另一个项目中,我希望能够致电:

import {Foo} from "@my-company/project-name/x/y/Foo"

我的项目结构如下:

<project_root>
|_ node_modules
|_ src
|  |_ x
|     |_ y
|     |  |_ Foo.ts
|     |_ Bar.ts
|_ package.json
|_ tsconfig.json

我的tsconfig.json文件:

{
  "compilerOptions": {
    "module": "es2015",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "declaration": true
  },
  "lib": ["es2015"],
  "include": [
    "src"
  ],
  "exclude": [
    "node_modules"
  ]
}

运行tsc的结果是创建了一个dist文件夹,其中包含d.ts文件和.js文件。运行npm pack时,我得到一个包含以下结构的.tgz文件。

请注意,它在目录结构中包含 dist 文件夹。

package
 |_ dist
 |  |_...
 |_ package.json

结果是我不能

import {Foo} from "@my-company/project-name/x/y/Foo"

但必须写

import {Foo} from "@my-company/project-name/dist/x/y/Foo"

代替(请注意路径中多余的 dist )。

基于node documentation,我想可以通过将以下内容添加到我的package.json文件中来解决此问题:

  "exports": {
    "./": "./dist/"
  }

但这似乎根本没有效果。除非我将多余的dist添加到路径中,否则找不到导入。

我发现了lot of other posts all with

  • 看起来非常复杂或与特定构建系统绑定的解决方案
  • 对我的软件包的用户强制执行特殊步骤的解决方案(例如使用编译器选项)
  • 已解决的Github问题(已解决!=已修复)的解决方案/建议
  • 旧的(超过2个互联网年)帖子,可能是从exports选项可用之前开始的。

我更愿意简单地使用该exports选项。有人知道我的设置中缺少什么或做错了什么吗?我对整个JS / TS / npm生态系统非常陌生,因此我认为我可能忽略了对退伍军人显而易见的事情。

目前,我发现的解决方法是手动重新创建tgz文件并从文件夹结构中删除dist文件夹。但这感觉远非完美。例如npm install link_to_git_repo无效。

1 个答案:

答案 0 :(得分:0)

仅使用开箱即用的package.json似乎是不可能的(请参阅此issue on npm)。建议的解决方法是直接从dist文件夹npm publish。这可以通过一些脚本轻松实现自动化,但仅在发布到npm时才有效,而在使用git url导入时则无效。