web-dev-qa-db-fra.com

Comment `Yarn Link` Un dossier dist?

Y a-t-il un moyen de faire un yarn link à un dossier dist ou lib liber?

Voici ma structure de code:

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

Si je fais cd dist && yarn link et fait yarn link package-a à un autre projet, il relie le package-a Dossier racine et non le dist, rendre l'importation ressemble à ceci:

import fn from 'package-a/dist/fn';

au lieu de simplement:

import fn from 'package-a/fn';

N'importe quel moyen de faire ce travail de côté de faire manuellement un lien symbolique?

8
edmandie

Ma solution pour cela était de conditionnellement alias les importations s'il y a un lien symbolique.

Dans mon projet, j'ai une dépendance package-a qui publie sur la racine, tandis que la version locale (Symlink) a les fichiers à publier sur package-a/dist

Sur ma liste de webPack, j'ai ce qui suit:

// 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")} )
    },
    ...
}

De cette façon, il ajoutera de manière conditionnelle un alias lorsque le sentier symbolique existe.

Une version plus générique, moins 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()
    },
    ...
}

Avec cela, vous n'avez pas à changer les importations et à les garder comme

import { something } from "package-a/anotherFile.js"
1
CanIHazCookieNow

Pas de réponse directe sur cette question, mais avec le fil, vous pouvez également spécifier un package en tant que dépendance locale et cela fonctionnera comme le lien, mais il ne nécessitera pas de package.json dans le dossier dist.

Spécifiez simplement dans le projet package.json où vous feriez yarn link foo:

"dependencies": {
  "foo": "link: ../foo/dist"
}

Ici, j'ai spécifié un chemin relatif, le vôtre pourrait être tout ce dans le système de fichiers local.

1
Alendorff