如何`yarn link`一个dist文件夹?

edm*_*die 10 node.js node-modules yarnpkg

有没有办法对yarn linkdist 或 lib 文件夹进行处理?

这是我的代码结构:

/package-a
  - package.json
  - src/
    - ...
  - dist/
    - ...

Run Code Online (Sandbox Code Playgroud)

如果我对另一个项目做cd dist && yarn link和做yarn link package-a,它会链接package-a根文件夹而不是 dist,使导入看起来像这样:

import fn from 'package-a/dist/fn';
Run Code Online (Sandbox Code Playgroud)

而不是简单地:

import fn from 'package-a/fn';
Run Code Online (Sandbox Code Playgroud)

除了手动执行符号链接之外,还有什么方法可以使这项工作?

Mar*_*vdB 10

yarn link将查找所在的文件夹package.json。因此,如果您将 package.json 复制到您的 dist,它应该可以工作:

yarn unlink
cp package.json /dist
cd dist
yarn link
```
Run Code Online (Sandbox Code Playgroud)


Ale*_*rff 7

不是这个问题的直接答案,但使用yarn,您还可以指定一个包作为本地依赖项,它的工作方式就像链接一样,但它不需要 package.json 位于文件夹中dist

只需在项目中指定package.json您要执行的操作yarn link foo

"dependencies": {
  "foo": "link: ../foo/dist"
}
Run Code Online (Sandbox Code Playgroud)

这里我指定了一个相对路径,你的可以是本地文件系统中的任何路径。

然而,根据我的经验,最好的方法是使用yalc


小智 1

我的解决方案是,如果存在符号链接,则有条件地为导入添加别名。

在我的项目中,我有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")} )
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

这样,当符号链接路径存在时,它将有条件地添加别名。

一个更通用、更少 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()
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

这样您就不必更改导入并将它们保留为

import { something } from "package-a/anotherFile.js"
Run Code Online (Sandbox Code Playgroud)