如何从我的包用户的导入语句中删除输出文件夹?
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 查询?