npm 如何从我的包用户的导入语句中删除输出文件夹?

9wbgstp7  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(200)

我有一个基于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的结果是创建了一个包含d.ts文件和.js文件的dist文件夹。当运行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)。
根据节点文档,我认为可以通过将以下内容添加到package.json文件来解决这个问题:

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


但这似乎没有任何效果。无法找到导入,除非我将额外的dist添加到路径中。
我找到了一个lotofotherpostsallwith

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

我更喜欢简单地让exports选项工作。有人知道我在设置中缺少了什么或做错了什么吗?我对整个JS/TS/npm生态系统非常陌生,所以我想我可能忽略了一些对老手来说很明显的东西。
目前,我找到的解决方法是手动重新创建tgz文件,并从文件夹结构中删除dist文件夹。但感觉远非完美。例如,npm install link_to_git_repo将无法工作。

laik7k3q

laik7k3q1#

在package.json中配置typesVersions为我解决了这个问题:

"exports": {
    "./": "./dist/"
  },
  "typesVersions": {
    "*": {
      "*": ["./dist/*"]
    }
  },

字符串

hgncfbus

hgncfbus2#

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

ebdffaop

ebdffaop3#

我发现的唯一可靠的方法是将package.json复制到dist中,然后从dist目录发布。
确保从package.json中删除./dist路径。
使用此方法的示例项目:https://github.com/dinomintstudio/vole

相关问题