是否可以对dist或lib文件夹执行yarn link
?
这是我的代码结构:
/package-a
- package.json
- src/
- ...
- dist/
- ...
如果我执行cd dist && yarn link
并执行yarn link package-a
到另一个项目,它将链接package-a
根文件夹而不是dist,从而使导入看起来像这样:
import fn from 'package-a/dist/fn';
而不是简单地:
import fn from 'package-a/fn';
除了手动执行符号链接之外,还有其他方法可以使这项工作吗?
答案 0 :(得分:2)
yarn link
将查找package.json
所在的文件夹。因此,如果将package.json复制到dist,它应该可以工作:
yarn unlink
cp package.json /dist
cd dist
yarn link
```
答案 1 :(得分:0)
为此,我的解决方案是在存在符号链接的情况下有条件地对导入进行别名。
在我的项目中,我有一个依赖项package-a
在根目录上发布,而本地版本(符号链接)具有要在package-a/dist
上发布的文件
在我的webpack配置中,我有以下内容:
// Check if package is symlinked, i.e. symlink path exists
const isPackageASymlinked = fs.existsSync(path.resolve(__dirname, "../node_modules/package-a/dist"))
...
// on my webpack resolve
resolve: {
alias: {
...(isPackageASymlinked && { "package-a": fs.realpathSync(path.resolve(__dirname, "../node_modules/package-a/dist")} )
},
...
}
这样,当符号链接路径存在时,它将有条件地添加一个别名。
更通用,更少ES6版本:
// package name -> node_modules symlink path
const SYMLINKED_DEP_PATHS = {
"package-a": "package-a/dist"
}
const symlinkInternalAlias = () => _.reduce(SYMLINKED_DEP_PATHS, (acc, symlinkPath, package) => {
const resolvedPath = path.resolve(__dirname, `../node_modules/${symlinkPath}`)
if (fs.existsSync(resolvedPath)) {
acc[package] = fs.realpathSync(resolvedPath)
}
return acc
}, {})
//and then just need to add to the alias
resolve: {
alias: {
...symlinkInternalAlias()
},
...
}
使用此方法,您不必更改导入并将其保留为
import { something } from "package-a/anotherFile.js"
答案 2 :(得分:0)
不是该问题的直接答案,但是使用yarn,您还可以将程序包指定为本地依赖项,它的工作方式类似于链接,但它不需要package.json位于dist
文件夹中
只需在项目的package.json
中指定您将在何处yarn link foo
:
"dependencies": {
"foo": "link: ../foo/dist"
}
在这里我指定了一个相对路径,您的路径可以是本地文件系统中的任何路径。