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

Posted

技术标签:

【中文标题】如何从我的包用户的导入语句中删除输出文件夹?【英文标题】:How to remove the output folder from the import statements for my package users? 【发布时间】:2020-01-27 13:19:42 【问题描述】:

我有一个基于 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)。

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

  "exports": 
    "./": "./dist/"
  

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

我找到了lotofotherpostsallwith:

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

我宁愿让exports 选项工作。有人知道我在设置中缺少什么或做错了吗?我对整个 JS/TS/npm 生态系统非常陌生,所以我认为我可能忽略了一些对老手来说显而易见的东西。

目前,我找到的解决方法是手动重新创建 tgz 文件并从文件夹结构中删除 dist 文件夹。但这感觉远非完美。例如npm install link_to_git_repo 将不起作用。

【问题讨论】:

只是一个想法:你能不能在你的项目的根目录下写一个 index.js,在这个 index.js 中,你导入你所有的 dist 文件,所以当你导入你的包时,你导入你的index.js 从 dist 文件夹中导入和导出所有函数/类? 这是一个选项,但它需要大量工作(也许可以自动化)。我的印象是使用exports 选项不再需要。看到 TS 越来越受欢迎,我也希望我不是第一个尝试解决这个问题的人 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何从我的包用户的导入语句中删除输出文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何从我从cli导入的Login.keychain中删除.p12文件?

如何从我网站上的所有 php 文件中删除 iframe 病毒

如何使用批处理文件或curl从我的文本文件中删除' r n'?

如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?

如何从 Flutter 中删除或识别未使用的包以减小项目的大小?

导入文件不可用时如何避免崩溃?..IOS 7