Yarn: Espaces de travail : verrouiller le fichier par espace de travail

CrĂ©Ă© le 28 fĂ©vr. 2018  Â·  54Commentaires  Â·  Source: yarnpkg/yarn

Vous souhaitez demander une fonctionnalité ou signaler un bug ?
caractéristique

Quel est le comportement actuel ?
L'utilisation d'espaces de travail de fil pour un monorepo qui inclut un module de nƓud de niveau supĂ©rieur ne crĂ©e qu'un seul yarn.lock Ă  la racine du monorepo, sans aucun yarn.lock spĂ©cifique au module de nƓud de niveau supĂ©rieur.

Quel est le comportement attendu ?
Je souhaite utiliser des espaces de travail de fil pour gĂ©rer un monorepo qui comprend Ă  la fois des applications (modules de nƓud de niveau supĂ©rieur) et des bibliothĂšques. Mais n'avoir qu'un seul fichier yarn.lock Ă  la racine du monorepo m'empĂȘche d'empaqueter mon application dans une image docker par exemple. J'aimerais un moyen d'obtenir un fichier yarn.lock pour les espaces de travail choisis qui doivent en avoir un, car cet espace de travail peut ĂȘtre utilisĂ© plus tard en dehors du monorepo.

Un exemple:
Si j'ai un monorepo avec 2 espaces de travail : workspace-a et workspace-b . workspace-a utilise certains des modules exportĂ©s de workspace-b . Si je veux empaqueter workspace-a dans une image docker (ou tout autre moyen d'empaqueter cet espace de travail par lui-mĂȘme, sans tout le monorepo), je n'ai pas de yarn.lock pour cela. Cela signifie que lorsque je dĂ©placerai les fichiers de workspace-a dans un environnement diffĂ©rent du monorepo, il me manquera un fichier yarn.lock et lors de l'installation des dĂ©pendances, je perdrai tous les avantages d'un fichier de verrouillage (sachant que j'installe les mĂȘmes dĂ©pendances utilisĂ©es dans le dĂ©veloppement).

Je suis assez surpris de ne pas avoir trouvĂ© de problĂšme Ă  ce sujet. Suis-je le seul Ă  vouloir travailler avec monorepos de cette façon ? Peut-ĂȘtre que j'ai ratĂ© quelque chose ? Ma solution de contournement actuelle consiste Ă  utiliser lerna sans aucun levage, j'aurai donc un fichier de verrouillage par package.
La fonctionnalitĂ© nohoist rĂ©cemment publiĂ©e ne semble pas non plus aider (mĂȘme si je l'espĂ©rais), car elle ne crĂ©e pas un yarn.lock par espace de travail.
Cette question est quelque peu liĂ©e Ă  ce commentaire sur une autre question. Je pensais qu'il mĂ©ritait peut-ĂȘtre un numĂ©ro Ă  lui tout seul.

Veuillez mentionner votre node.js, le fil et la version du systĂšme d'exploitation.
nƓud 8.9.3, fil 1.5.1, OSX 10.13.3

cat-feature triaged

Commentaire le plus utile

Donc, pour nous, nous ne voulons pas empaqueter l'ensemble du monorepo dans le conteneur docker rĂ©sultant. Nous utilisons docker en production et ces images doivent ĂȘtre aussi claires que possible. Notre dĂ©pĂŽt mono est assez volumineux et contient plusieurs microservices qui partagent du code entre eux Ă  l'aide de packages de bibliothĂšque (et certaines bibliothĂšques sont pertinentes pour certains microservices, mais pas tous). Ainsi, lorsque nous empaquetons un microservice, nous voulons que l'image contienne les fichiers de ce microservice et toutes les autres dĂ©pendances en tant que dĂ©pendances appropriĂ©es - tĂ©lĂ©chargĂ©es Ă  partir de notre registre privĂ© et crĂ©Ă©es pour l'arche de l'image docker.

Je pense donc que la principale considération ici est de garder nos images de docker aussi légÚres que possible, et l'emballage de l'ensemble du monorepo ne correspond pas à nos besoins. De plus, lorsque nous exécutons "yarn" à l'intérieur de l'image du microservice, nous ne voulons pas y avoir de liens symboliques, juste une dépendance normale.

La solution ici n'a pas besoin de créer un fichier fil.lock par espace de travail, il peut également s'agir d'une commande fil, qui aide au processus d'empaquetage d'un espace de travail donné, générant un fichier fil.lock pour un espace de travail à la demande, etc. ..

J'espĂšre que cela a aidĂ© Ă  clarifier le cas d'utilisation .. đŸ»

Tous les 54 commentaires

basé sur le blog de laine :

Lorsque vous publiez un package qui contient un fil.lock, aucun utilisateur de cette bibliothÚque n'en sera affecté. Lorsque vous installez des dépendances dans votre application ou bibliothÚque, seul votre propre fichier fil.lock est respecté. Les fichiers de verrouillage dans vos dépendances seront ignorés.

il ne semble pas nécessaire de regrouper wire.lock lors de la publication du package individuel... il s'agit plutÎt d'un artefact de développement pour l'ensemble du référentiel, il n'est donc pas nécessaire de le mettre dans chaque package.

@connectdotz, il n'est peut-ĂȘtre pas nĂ©cessaire pour une bibliothĂšque ou un package publiĂ©, mais pour crĂ©er un conteneur Docker, vous voudrez le dĂ©ployer quelque part, ce serait certainement le cas.

bien sûr ... mais le conteneur docker de développement n'aurait-il pas tout le dépÎt et donc le fil.lock de toute façon? Je peux voir que nous utilisons des conteneurs docker pour tester notre projet monorepo pour différents systÚmes d'exploitation ou plates-formes, auquel cas nous déployons simplement l'ensemble du référentiel et son fil.lock. Pouvez-vous me donner un exemple de cas d'utilisation dont vous avez besoin pour déployer des packages individuels du projet monorepo dans des conteneurs Docker pendant le cycle de développement, afin que je puisse avoir une compréhension plus concrÚte...

Donc, pour nous, nous ne voulons pas empaqueter l'ensemble du monorepo dans le conteneur docker rĂ©sultant. Nous utilisons docker en production et ces images doivent ĂȘtre aussi claires que possible. Notre dĂ©pĂŽt mono est assez volumineux et contient plusieurs microservices qui partagent du code entre eux Ă  l'aide de packages de bibliothĂšque (et certaines bibliothĂšques sont pertinentes pour certains microservices, mais pas tous). Ainsi, lorsque nous empaquetons un microservice, nous voulons que l'image contienne les fichiers de ce microservice et toutes les autres dĂ©pendances en tant que dĂ©pendances appropriĂ©es - tĂ©lĂ©chargĂ©es Ă  partir de notre registre privĂ© et crĂ©Ă©es pour l'arche de l'image docker.

Je pense donc que la principale considération ici est de garder nos images de docker aussi légÚres que possible, et l'emballage de l'ensemble du monorepo ne correspond pas à nos besoins. De plus, lorsque nous exécutons "yarn" à l'intérieur de l'image du microservice, nous ne voulons pas y avoir de liens symboliques, juste une dépendance normale.

La solution ici n'a pas besoin de créer un fichier fil.lock par espace de travail, il peut également s'agir d'une commande fil, qui aide au processus d'empaquetage d'un espace de travail donné, générant un fichier fil.lock pour un espace de travail à la demande, etc. ..

J'espĂšre que cela a aidĂ© Ă  clarifier le cas d'utilisation .. đŸ»

@netanelgilad merci pour les détails, cela aide à clarifier que votre cas d'utilisation concerne davantage la publication de packages individuels, pour la production ou le développement, dans des conteneurs docker. Veuillez vous joindre à la discussion au #4521 afin que nous puissions commencer à les consolider.

Bien que je puisse voir l'utilisation de fichiers de verrouillage individuels, ils ne sont pas nécessaires. Si vous exécutez docker à partir de la racine du référentiel avec l'indicateur -f pointant vers les fichiers individuels, vous aurez le référentiel entier comme contexte et pourrez copier dans le package.json et le fil.lock à partir de la racine.

Vous n'avez besoin que du package.json pour les packages que vous allez crĂ©er dans l'image et fil n'installera que les packages pour les fichiers package.json que vous avez copiĂ©s, mĂȘme si le fil.lock comprend beaucoup plus.

EDIT : Cela dit. cela empĂȘche l'utilisation du cache docker pour les modifications de package dans un package, mĂȘme s'il n'est pas inclus dans la construction

4206 est lié/en double, et le cas d'utilisation décrit ici est exactement le problÚme auquel nous sommes confrontés :

Disons que nous avons dix packages différents. Nous voulons qu'ils vivent tous dans leur propre référentiel afin que les gens puissent travailler dessus de maniÚre indépendante s'ils le souhaitent, mais nous voulons également pouvoir les relier entre eux si nous en avons besoin. Pour ce faire, nous avons un méga référentiel avec un sous-module pour chaque package, et un package.json qui référence chacun de ces sous-modules en tant qu'espace de travail.

J'ai des problÚmes similaires avec les espaces de travail. Mon projet est un web-app qui dépend de nombreux packages locaux :

web-app/
|--node_modules/
|--packages/
|  |--controls/
|  |  |--src/
|  |  |--package.json
|  |--utils/
|     |--src/
|     |--package.json
|--src/
|--package.json
|--yarn.lock

Les packages d'espace de travail controls et utils ne sont pas publiés et sont utilisés par les chemins. Le problÚme est que je dois publier le package controls ( yarn pack ) et je ne veux pas le construire/tester tout seul. Cela signifie que je veux faire yarn install intérieur de web-app/packages/constols/ . Avec les espaces de travail, il utilisera le fichier de niveau supérieur web-app/yarn.lock fichier de niveau supérieur web-app/node-modules/ . Ainsi, il installe tous les packages au lieu d'un sous-ensemble, spécifié dans web-app/packages/controls/package.json . Mais je dois vérifier que mon package a toutes les dépendances requises dans ses propres package.json et ne fonctionne pas par chance de remplir les deps manquants d'autres espaces de travail.

Il y a 2 solutions possibles :

  1. S'il n'est pas root, utilisez le yarn.lock root, mais installez uniquement les packages spécifiés dans le package.json local.
  2. Ne recherchez pas les configurations de niveau supérieur, mais .yarnrc/.npmrc .

Aussi aux prises avec cela. Nous avons un projet Angular CLI Ă  cĂŽtĂ© de notre API, ils sont donc dans le mĂȘme rĂ©fĂ©rentiel et essaient de pousser le frontend vers Heroku.

Nous utilisons un pack de construction qui indique à Heroku de passer d'abord au référentiel frontal : https://github.com/lstoll/heroku-buildpack-monorepo

Le problÚme est qu'il n'y a pas de yarn.lock intérieur de ce package nohoist donc Heroku s'installe simplement avec npm et nous nous retrouvons avec tous les nouveaux packages plutÎt que ceux verrouillés

Vous pouvez simplement utiliser le fichier fil.lock global avec les packages individuels. J'ai récemment approché mon Dockerfile comme ceci :

WORKDIR /app
ENV NODE_ENV=production

ADD yarn.lock /app/
ADD package.json /app/

# Only copy the packages that I need
ADD packages/my-first-package /app/packages/my-first-package
ADD packages/my-second-package /app/packages/my-second-package

RUN cd /app && yarn install --frozen-lockfile

Cela n'installera que les dépendances réellement utilisées par les deux packages que j'ai copiés et par personne d'autre.

J'ai un processus de construction oĂč j'aimerais d'abord crĂ©er un artefact de version Ă  partir d'un package, puis aucune de ses dĂ©pendances n'est installĂ©e. C'est assez facile avec la construction en plusieurs Ă©tapes de Docker

  1. Ajoutez uniquement fil.lock, package.json et le package d'interface utilisateur Ă  docker
  2. courir yarn install --frozen-lockfile
  3. exécuter le processus de construction
  4. démarrez une nouvelle étape et ajoutez fil.lock, package.json et les packages d'exécution/dossiers d'espace de travail nécessaires
  5. Faites un COPY --from=<stage> pour l'artefact construit
  6. exécutez yarn install --frozen-lockfile et exposez une commande RUN .

Et vous vous retrouverez avec un petit conteneur qui ne contient que les dépendances spécifiées dans votre fichier fil.lock et nécessaires à la production.

@johannes-scharlach
J'ai fini par utiliser une méthode presque identique à ce que vous décrivez. la construction en plusieurs étapes est un bon conseil :).

@connectdotz Je pense que de mon cĂŽtĂ©, ce problĂšme pourrait ĂȘtre clos et nous pouvons continuer Ă  travailler sur le problĂšme #4521. Étant donnĂ© que le fichier fil.lock principal pourrait fonctionner avec un sous-ensemble des packages, il semble qu'un fil.lock par espace de travail n'est pas nĂ©cessaire (mĂȘme si je pense toujours que cela pourrait ĂȘtre un meilleur workflow de dĂ©veloppement 😉 ). Mais le problĂšme dans # 4521 est toujours important, car dans la solution Ă  laquelle nous sommes arrivĂ©s ici, nous devons mentionner chaque espace de travail de dĂ©pendance dans le Dockerfile mĂȘme si fil doit connaĂźtre les interdĂ©pendances et comment "fournisseur" un espace de travail donnĂ©.

J'ai passé les deux derniers jours à essayer de convertir notre monorepo en espaces de travail Lerna puis Yarn. Le fil a fonctionné généralement de maniÚre plus fiable et il est vraiment proche de ce dont nous avons besoin, en particulier avec l'introduction récente de yarn workspaces run <script> et d'autres bonnes choses comme wsrun .

Cependant, le single yarn.lock est un problÚme :

  • Je ne sais pas comment migrer correctement nos fichiers de verrouillage existants vers un seul, voir https://github.com/yarnpkg/yarn/issues/6563. Nous y avons des dizaines de milliers de lignes et l'ajout de packages existants en tant qu'espaces de travail a introduit de nombreux problĂšmes subtils de version.
  • L'installation de dĂ©pendances dans un package spĂ©cifique uniquement ("de-hoisting" / "vendoring") La construction dockerisĂ©e n'est pas bien prise en charge, voir ci-dessus (https://github.com/yarnpkg/yarn/issues/5428#issuecomment-403722271) ou https : //github.com/yarnpkg/yarn/issues/4521.

Que penseriez-vous du fait que les espaces de travail Yarn ne soient qu'un petit noyau - une déclaration de packages sans aucune fonctionnalité spécifique. Par exemple:

  • Si vous vouliez exĂ©cuter un script dans vos espaces de travail, vous feriez yarn workspaces run <script> .
  • Si vous vouliez un seul fichier de verrouillage et de levage (les deux sont-ils forcĂ©ment liĂ©s ensemble ?), ce serait votre racine package.json :
    json "workspaces": { "packages": ["packages/*"], "hoistDependencies": true }
  • Si vous vouliez migrer vos fichiers de verrouillage actuels vers une structure hissĂ©e, vous exĂ©cuteriez yarn workspaces hoist-dependencies .

Etc. Ce ne sont que des exemples et dans la pratique, certaines fonctionnalitĂ©s seraient probablement dĂ©sactivĂ©es au lieu d'ĂȘtre activĂ©es (par exemple, les gens s'attendent Ă  un seul yarn.lock et Ă  un levage maintenant) mais l'idĂ©e gĂ©nĂ©rale est que les espaces de travail ĂȘtre une base lĂ©gĂšre pour les tĂąches Ă  l'Ă©chelle du dĂ©pĂŽt.

Qu'est-ce que tu penses?

Je pense que le problĂšme auquel cette demande de fonctionnalitĂ© rĂ©pond est le mĂȘme que dans #4521 . Une commande pour faire essentiellement ce que @johannes-scharlach dĂ©crit serait certainement plus faisable qu'un fichier de verrouillage par espace de travail.

Il existe également une RFC ouverte en ce moment pour les espaces de travail imbriqués , ce qui ressemble à cette demande de fonctionnalité, bien que je pense que cela résout un problÚme différent.

Que penseriez-vous des espaces de travail Yarn n'étant qu'un petit noyau - une déclaration de packages sans aucune fonctionnalité spécifique

Les espaces de travail ne changeront pas radicalement, je pense que nous sommes satisfaits de leur interface actuelle.

Si vous vouliez exécuter un script dans vos espaces de travail, vous feriez yarn workspaces run <script>

C'est déjà possible (v1.10, #6244).

Si vous vouliez migrer vos fichiers de verrouillage actuels vers une structure hissée, vous exécuteriez yarn workspaces hoist-dependencies .

Puisque nous ne changerons pas l'interface de l'espace de travail, ce serait le contraire ( dehoistDependencies ).

Ce que je n'aime pas Ă  ce sujet, c'est qu'il prend un comportement technique (levage) et essaie de le transformer en un comportement sĂ©mantique. Vous devez vous concentrer sur l'histoire de l'utilisateur, puis comprendre la mise en Ɠuvre plutĂŽt que l'inverse.

Dans ce cas, je pense que votre cas d'utilisation ("Installation de dépendances dans un package spécifique uniquement") serait mieux résolu en étendant yarn --focus .

Je suppose que la question centrale est de savoir si le levage et un seul fichier yarn.lock sont strictement nécessaires pour les espaces de travail. Je veux dire, est-ce que ce qui les définit vraiment ou est-ce "juste" la premiÚre caractéristique qu'ils ont historiquement?

Par exemple, dans notre cas d'utilisation, le meilleur comportement hypothétique des espaces de travail serait :

  • Levez node_modules au moment du dĂ©veloppement pour plus d'efficacitĂ©.
  • Conservez les fichiers yarn.lock locaux pour la construction (nous construisons des packages spĂ©cifiques dans Docker, ce que d'autres personnes ont Ă©galement mentionnĂ© dans ce fil) et Ă©galement pour que les packages puissent verrouiller leurs versions spĂ©cifiques. Voir aussi #6563.
  • ExĂ©cutez des scripts via yarn workspaces run <script> mĂȘme si vous n'avez pas besoin (ou devez Ă©viter) de levage.

Le levage peut ĂȘtre dĂ©sactivĂ© avec nohoist , run peut ĂȘtre "dĂ©sactivĂ©" en n'utilisant tout simplement pas la commande mais il n'est pas possible de "dĂ©sactiver" le seul fichier yarn.lock , et I' Je ne sais pas si c'est une fonctionnalitĂ© si essentielle qu'elle ne peut pas ĂȘtre dĂ©sactivĂ©e ou si elle n'a tout simplement pas encore Ă©tĂ© suffisamment demandĂ©e :)

Je pense que la meilleure façon de résoudre ce problÚme serait d'avoir yarn install --app-mode package@version

De cette façon, vous pouvez simplement copier les fichiers de verrouillage de l'espace de travail lors de la publication de votre application à une certaine version, et l'installation dans app-mode respectera le fichier de verrouillage fourni.

Yarn n'a pas besoin d'installer l'intĂ©gralitĂ© du fichier de verrouillage ; il devrait ĂȘtre facilement capable d'extraire uniquement la partie du graphe de dĂ©pendances correspondant Ă  ce package.

En fait, cela pourrait ĂȘtre assez facile Ă  faire manuellement mĂȘme maintenant :

  • tĂ©lĂ©chargez le package zip directement depuis le registre (le fil n'a pas d'Ă©quivalent, npm le fait : npm pack package@version )
  • extraire le gzip dans node_modules/package
  • cd dans node_modules/package
  • exĂ©cutez fil install --production Ă  partir de lĂ  (il respectera le fichier de verrouillage fourni)

edit : malheureusement, tout est faux, car le fichier de verrouillage de l'espace de travail n'inclut pas les versions des packages dans l'espace de travail, qui peuvent ĂȘtre des dĂ©pendances du package de l'application. Il faudrait quelque chose de plus impliquĂ© que la copie lors de la crĂ©ation de fichiers de verrouillage d'application Ă  partir de fichiers de verrouillage d'espace de travail.

Je ne sais pas exactement si des fichiers de verrouillage séparés sont la réponse, mais j'ai un problÚme similaire. J'ai configuré un monorepo avec une CLI et un backend. La CLI nécessite quelques packages spécifiques à la plate-forme et ne fonctionne que sur les ordinateurs de bureau avec une configuration particuliÚre. D'un autre cÎté, j'ai besoin de pouvoir construire mon api dans une image docker, ce qui est fondamentalement impossible dans l'implémentation actuelle des espaces de travail.

Cas d'utilisation trĂšs similaire Ă  celui de @samuela ici ! Celui-ci serait extrĂȘmement utile!

Mon cas d'utilisation peut sembler risible par rapport aux autres, "vrais". Mais j'ai un monorepo pour certains utilitaires - dans ce cas, des crochets de réaction - à l'intérieur de packages/* .

J'ai un deuxiÚme espace de travail à cÎté de packages/* , et c'est local/* . C'est en fait sur gitignore, et l'idée est que les développeurs de l'entreprise peuvent y faire ce qu'ils veulent, par exemple y mettre des applications create-react-app et tester les crochets pendant le développement.

Maintenant, bien que les packages local/* soient sur gitignore, la racine yarn.lock est simplement gonflée et polluée - et vérifiée dans git - à cause des espaces de travail locaux.

Ce que je souhaiterais, c'est un moyen de spécifier que certains espaces de travail doivent utiliser des fichiers de verrouillage spécifiques, par exemple un mappage comme ceci :

  "workspaces": {
    "packages": [
      "packages/*",
      "local/*"
    ],
    "lockfiles": {
      "local/*": "./local.yarn.lock"
    }
  }

Ou mĂȘme un moyen de spĂ©cifier "ne rien mettre du tout de _ce_ espace de travail dans le fichier de verrouillage".

Mais oui, le mien n'est pas un cas d'utilisation sérieux en premier lieu :)

Je ne sais pas exactement si des fichiers de verrouillage séparés sont la réponse, mais j'ai un problÚme similaire. J'ai configuré un monorepo avec une CLI et un backend. La CLI nécessite quelques packages spécifiques à la plate-forme et ne fonctionne que sur les ordinateurs de bureau avec une configuration particuliÚre. D'un autre cÎté, j'ai besoin de pouvoir construire mon api dans une image docker, ce qui est fondamentalement impossible dans l'implémentation actuelle des espaces de travail.

Vous l'avez compris - à mon avis, l'un des principaux avantages du fichier fil.lock est de créer des versions de production gelées ! Les créateurs de Yarn l'ont-ils oublié ?

Un autre argument pour rĂ©soudre le problĂšme du fichier de verrouillage unique est la propriĂ©tĂ© du code. Si vous avez un monorepo qui utilise quelque chose comme la fonctionnalitĂ© GitHub CODEOWNERS, il n'est pas possible de donner la propriĂ©tĂ© complĂšte d'un package Ă  un groupe de dĂ©veloppeurs. C'est parce que s'ils installent quelque chose dans leur propre espace de travail, ils changeront invariablement le fichier de verrouillage au niveau racine. Ce changement devra ĂȘtre approuvĂ© par les propriĂ©taires de code du fichier de verrouillage, qui, Ă©tant donnĂ© un monorepo d'une Ă©chelle suffisante, sera diffĂ©rent des propriĂ©taires de l'espace de travail d'origine.

Encore une autre raison d'avoir une option pour générer des fichiers de verrouillage par espace de travail : Google App Engine refuse de lancer un service Node sans fichier de verrouillage (NPM/Yarn). C'est d'excellents devops de leur part, mais une douleur pour nous. Jusqu'à présent, les options que nous avons sont:

  • DĂ©ployez tout avec env vars indiquant de quel service nous parlons et modifiez notre yarn start (le seul point d'entrĂ©e pris en charge) pour crĂ©er une branche basĂ©e sur env vars
  • Demandez au script de construction de copier le fichier de verrouillage principal dans chaque espace de travail et de dĂ©ployer uniquement le service qui nous intĂ©resse. (merci @johannes-scharlach)

En fin de compte, je pense qu'une commande yarn install --workspace-lockfile qui génÚre des fichiers de verrouillage par espace de travail serait la meilleure solution.

Avoir une option pour les fichiers de verrouillage au niveau du package nous aiderait également. Notre cas d'utilisation est un peu différent, nous testons une nouvelle façon de gérer les dépendances locales.

Nous avons donc dĂ©jĂ  des dĂ©pĂŽts mono, et nous avons des dĂ©pĂŽts qui ne contiennent qu'un seul package. Ceux-ci sont tous publiĂ©s et peuvent donc ĂȘtre utilisĂ©s ensemble, mais il arrive souvent que les avoir localement et liĂ©s symboliquement soit trĂšs utile.

Mais certains dĂ©veloppeurs ont du mal Ă  gĂ©rer les liens symboliques, etc. Nous essayons donc un rĂ©fĂ©rentiel mono d'espace de travail de fil vide standard que nous clonons tous sur nos machines, puis nous clonerons les rĂ©fĂ©rentiels de packages dans ce rĂ©fĂ©rentiel mono local. Certains d'entre nous n'ont peut-ĂȘtre qu'un seul clone de paquet, d'autres en ont 5. C'est trĂšs pratique et fait du dĂ©veloppement local, inter-repo, inter-dĂ©pendance un jeu d'enfant.

Mais nous avons rencontré un problÚme que nous ne pouvons pas résoudre, la modification des dépendances ne met pas à jour le fichier de verrouillage de fil local, il met toujours à jour le fichier racine pour le référentiel mono vide sur lequel nous ne mettons pas à jour les dépendances (il a tout sous /packages gitignoré.

Avoir la possibilité de ne pas hisser les écritures de fichiers de verrouillage à la racine du référentiel mono serait formidable et les faire écrire au niveau du package.

En guise de note, j'ai également rencontré des problÚmes de déploiement et de construction autour de Docker que d'autres ont mentionnés et cela résoudrait également cela!

Cette fonctionnalité me serait également trÚs précieuse. Dans mon cas, j'ai un monorepo avec quelques packages déployés sur différentes plates-formes. L'une est une application Next.js déployée avec Now.sh et l'autre est un ensemble de fonctions cloud déployées sur Firebase.

Dans ces deux déploiements, le code source est regroupé et téléchargé pour l'installation et la construction dans le cloud. Ne pas avoir yarn.lock fichier

J'aimerais aussi pouvoir activer les fichiers fils.lock dans chaque espace de travail.

Je me rends compte que les espaces de travail de fil sont principalement destinés aux monorepos, mais notre cas d'utilisation est assez similaire à celui de @LeeCheneler .

Fondamentalement, nous avons créé une bibliothÚque de composants React que nous utilisons comme dépendance dans différents projets (qui ont tous leurs propres dépÎts). En utilisant des espaces de travail de fil, nous pouvons facilement référencer la version locale de la bibliothÚque de composants et faire en sorte que les modifications se propagent rapidement à la version locale de nos autres projets. Nous n'avons pas non plus besoin de modifier le package.json lorsque nous passons en production car la dépendance library: "*" fonctionne sans aucun changement. Notre seul problÚme est que, sans fichiers de fils de verrouillage, les versions de production de chaque projet pourraient utiliser différentes versions de package.

Je dois imaginer que ce problÚme serait commun à tous les développeurs de packages qui utilisent des espaces de travail de fil.

Un autre problĂšme critique avec un fichier de verrouillage de niveau supĂ©rieur est qu'il casse la mise en cache de couche de Docker. On serait gĂ©nĂ©ralement en mesure d'optimiser la mise en cache Docker en copiant d'abord le package.json et le fil.lock. Si Docker ne voit aucun changement dans ces fichiers, il utilisera une couche prĂ©cĂ©dente. Si ce fichier de verrouillage est un seul pour l'ensemble du monorepo, cependant, toute modification dans un package invalide le cache. Pour nous, cela se traduit par des pipelines CI/CD ridiculement lents oĂč chaque package est construit sans le cache. Il existe d'autres outils, comme Lerna, qui vĂ©rifient les modifications apportĂ©es aux packages pour exĂ©cuter certains scripts. Cela s'interrompt Ă©galement car une modification de dĂ©pendance dans le fichier de verrouillage peut ne pas ĂȘtre dĂ©tectĂ©e car elle est au niveau supĂ©rieur.

DĂ©solĂ© de soulever ce problĂšme (un peu ancien), mais j'ai aussi un cas d'utilisation dans lequel cela serait utile. J'ai une dizaine de microservices qui sont hĂ©bergĂ©s et dĂ©veloppĂ©s indĂ©pendamment, mais ce serait bien d'avoir un rĂ©fĂ©rentiel d'espace de travail central oĂč vous pouvez taper yarn install pour installer des dĂ©pendances dans tous les dossiers, puis exĂ©cuter yarn start pour exĂ©cuter un script qui dĂ©marrera tous les microservices. C'est quelque chose qui pourrait ĂȘtre fait avec un script relativement simple mais cela semblait Ă©galement faisable avec des espaces de travail de fil mais je ne pouvais pas le faire fonctionner tout en respectant le fil.locks dans chaque microservice

@nahtnam Je pense que l'idĂ©e de Yarn 1.x monorepo est un peu diffĂ©rente. Il ne s'agit pas de projets indĂ©pendants sous un mĂȘme toit, il s'agit plutĂŽt d'un grand projet singulier dont certains de ses composants sont exposĂ©s (appelĂ©s espaces de travail). Ces composants ne sont pas entiĂšrement indĂ©pendants, mais peuvent ĂȘtre utilisĂ©s ainsi : le compilateur Babel comme une entitĂ© plus grande et preset-env comme sous-module. De plus, ils sont homogĂšnes dans le sens oĂč leurs dĂ©pendances sont unifiĂ©es : si certains packages dĂ©pendent de core-js , il devrait s'agir de la mĂȘme version core-js dans chacun d'eux, car vous ne pouvez pas verrouiller diffĂ©rentes versions avec un seul fichier de verrouillage racine, il n'est pas non plus logique que les parties du projet dĂ©pendent de diffĂ©rentes versions. Et comme il s'agit d'un seul projet, tous ses composants sont automatiquement liĂ©s Ă  la racine node_modules , ce qui est Ă©trange pour des projets entiĂšrement indĂ©pendants.

Donc, si vous dĂ©veloppez un pack de microservices (qui sont indĂ©pendants, et certains d'entre eux ne seront pas touchĂ©s pendant des annĂ©es tandis que d'autres seront crĂ©Ă©s/mis Ă  jour, peut-ĂȘtre dĂ©veloppĂ©s par diffĂ©rentes Ă©quipes), alors ils devraient avoir des fichiers de verrouillage personnels sans racine lock (le problĂšme Docker va ici aussi). La seule question est de savoir quel outil vous aidera Ă  exĂ©cuter des scripts. Lerna pourrait ĂȘtre une rĂ©ponse car elle n'est pas liĂ©e au fil.

La seule question est de savoir quel outil vous aidera Ă  exĂ©cuter des scripts. Lerna pourrait ĂȘtre une rĂ©ponse car elle n'est pas liĂ©e au fil.

@the-spyke Pas seulement ça. yarn workspaces rĂ©sout Ă©galement, en liant les modules pour le dĂ©veloppement de la mĂȘme maniĂšre que npm link , ce qui est la principale raison pour laquelle nous l'utilisons. npm link ne fonctionne pas bien dans certains cas.

@the-spyke Merci ! Pour une raison quelconque, je pensais qu'il était inversé (espaces de travail lerna vs fil). J'ai regardé dans lerna et il semble que cela résolve mon problÚme

J'ai fini par utiliser des espaces de travail pour chaque projet sur lequel je travaille, en raison de la facilitĂ© d'avoir un package utilities sĂ©parĂ© que je peux mettre Ă  jour en cas de besoin (mĂȘme s'il est publiĂ©), et du fait que Je n'ai pas besoin de rĂ©installer les dĂ©pendances si je veux forker un paquet (me permettant essentiellement de travailler sur deux branches en mĂȘme temps, ce qui pour moi Ă©tait du jamais vu), et chaque fois que je veux utiliser un paquet de mon utilities (qui comprend la plupart des choses que j'utilise habituellement), je peux l'utiliser tout de suite sans l'ajouter Ă  package.json du deuxiĂšme paquet (mais c'est Ă©videmment une bonne idĂ©e en cas d'installation sĂ©parĂ©e, et c'est nĂ©cessaire pour les importations automatiques IDE) ; tout fonctionne. @the-spyke fait valoir un bon point, peut-ĂȘtre que independent projects under one roof n'est pas le but des espaces de travail, et pourtant c'est Ă  peu prĂšs ce que je semble faire ici : j'ai un seul rĂ©fĂ©rentiel monorepo-base , qui exclut le dossier packages , tandis que chaque dossier sous packages est un dĂ©pĂŽt git indĂ©pendant distinct.
image
Bien sĂ»r, cela m'amĂšne au sujet de ce fil; puisque je ne commets pas tous les packages en un seul dĂ©pĂŽt, le niveau racine yarn.lock n'a pas de sens. J'ai utilisĂ© --no-lockfile pour tout installer et j'ai rĂ©cemment rencontrĂ© un problĂšme avec des versions conflictuelles de class-validator . Pour l'instant, je vais verrouiller tous les deps sur des versions spĂ©cifiques (honnĂȘtement, ce niveau de contrĂŽle a plus de sens pour moi) et voir comment cela fonctionne. Je vais relire toute la bande de roulement, il y a peut-ĂȘtre quelques astuces que je pourrais utiliser pour mon cas d'utilisation.

PS.
yarn why ne fonctionne pas sans fichier de verrouillage pour un, et j'ai remarquĂ© que certaines personnes mentionnaient des problĂšmes avec App Engine. Je suppose que dans le cas oĂč chaque paquet serait un dĂ©pĂŽt sĂ©parĂ©, le fichier de verrouillage pourrait ĂȘtre gĂ©nĂ©rĂ© Ă  chaque fois lors de l'installation (sans l'ajouter Ă  VCS) ? Pas sĂ»r de ce cas prĂ©cis.

Malheureusement, la solution suggĂ©rĂ©e par @johannes-scharlach devient trĂšs compliquĂ©e si votre image construite nĂ©cessite des modules de nƓud d'exĂ©cution qui ne sont pas inclus dans un dossier de construction, car vous devrez dĂ©terminer exactement quels modules doivent ĂȘtre exĂ©cutĂ©s et les copier minutieusement dans la derniĂšre Ă©tape de la construction.

(légÚrement hors sujet) @GrayStrider vous pouvez également utiliser le champ "résolutions" dans package.json - c'est le seul moyen de forcer une version sur une dépendance imbriquée, par exemple si vous voulez que tous les lodashs soient la version exacte, peu importe combien profondément imbriqué. Cependant, cela peut introduire des bugs trÚs subtils qui seront difficiles à repérer.

Voici une solution sur laquelle nous sommes arrivés - avec un impact minimal sur le flux de travail Docker existant.

  1. ln project/yarn.lock packages/package1/yarn.lock - crée un lien symbolique à partir de la racine yarn.lock dans chaque paquet.
  2. Ajoutez COPY yarn.lock . Ă  chaque packages/package1/Dockerfile
  3. yarn install intérieur de Docker

Avantages :

  • Ne pas avoir Ă  copier l'intĂ©gralitĂ© de votre monorepo dans un calque d'image
  • Vous n'avez pas besoin de fusionner vos fichiers Dockerfile au niveau du package en un seul Dockerfile Ă  la racine
  • Satisfait essentiellement aux exigences des fichiers de verrouillage de l'espace de travail

Inconvénients :

  • --frozen-lockfile ne fonctionne pas. Comme les packages d'espaces de travail ne sont pas inclus dans le yarn.lock , donc le fil voit un package que vous avez "ajoutĂ©" au package.json qui n'existe pas dans le yarn.lock

Il s'agit néanmoins d'un inconvénient mineur, car vous pouvez le contourner en effectuant un yarn --frozen-lockfile comme premiÚre étape de votre pipeline CI/CD

Éditer:
En passant, je pense vraiment que la documentation de fil sur l'installation pourrait ĂȘtre un peu plus claire sur la façon dont le fichier de verrouillage est utilisĂ© par le processus de rĂ©solution de package.

Éditer:
Il s'avÚre donc que git ne prend pas réellement en charge les liens physiques, il ne prend en charge que les liens symboliques logiciels, donc cette stratégie ne fonctionnera pas.

Une autre alternative consiste simplement à utiliser un gitook de pré-engagement pour copier le yarn.lock dans chacun de vos espaces de travail... ce n'est pas idéal car cela permet toujours des problÚmes lors du déploiement à partir de votre machine locale.

@dan-cooke merci beaucoup pour vos idées, trÚs appréciées!

@dan-cooke, cela interrompt la mise en cache de la couche Docker car une nouvelle dépendance dans n'importe quel espace de travail invaliderait la couche d'installation pour tous les fichiers Docker.

@migueloller Si la couche d'installation ne doit pas changer, vous ne devez pas utiliser un seul fichier de verrouillage pour tous les packages. L'aplatissement et le levage des dépendances dans une seule liste géante est l'objectif principal des espaces de travail. Ce n'est pas comme si cela "casse" le cache Docker, le cache est invalidé car les vraies dépendances ne sont pas spécifiées dans package.json , donc le code final de votre package dépend du contenu de yarn.lock . En conséquence, vous devez reconstruire tous les packages à chaque modification de yarn.lock et Docker fait tout correctement. Et ce n'est pas comme where every package is built without the cache car tous les builds pourraient réutiliser le calque avec yarn install (vous devrez probablement le configurer).

@migueller
Correct. Heureusement, nous n'ajoutons pas souvent de nouvelles dépendances, donc ce ne sera un problÚme qu'une fois par sprint au plus.

Et mĂȘme alors, c'est un petit prix Ă  payer (pour nous) pour des dĂ©pendances reproductibles dans Docker

@the-spyke, en effet. C'est pourquoi ce problÚme concerne la création d'un fichier de verrouillage individuel par package. De cette façon, la couche mise en cache n'est invalidée que lorsque les dépendances du package changent et est indépendante des autres packages.

Peut-ĂȘtre que cela vaut Ă©galement la peine de dĂ©placer cette discussion vers npm lui-mĂȘme, qui prend Ă©galement en charge les espaces de travail Ă  partir de la v7.0.

J'ai fait des recherches sur des sujets connexes et j'aimerais ajouter quelques éclaircissements à mon commentaire ci-dessus (principalement destiné aux développeurs moins expérimentés, je suppose, car les problÚmes auxquels je faisais face étaient dans une certaine mesure dus à mon incapacité à comprendre l'importance de lockfile ).

"verrouiller toutes les dĂ©pendances Ă  une version spĂ©cifique" est appelĂ© Ă©pingler ; malheureusement, cela n'empĂȘchera pas les choses de casser potentiellement si les sous- dĂ©pendances sont mises Ă  jour (derniers paragraphes de l'article ici ), ce que je n'ai pas pris en compte. C'est exactement ce que lockfile voulait empĂȘcher de se produire.

J'ai perdu plus qu'assez d'heures Ă  interrompre les mises Ă  jour dans le passĂ© Ă  plusieurs reprises ; Je vais expĂ©rimenter avec l'utilisation de lockfile en monorepo, car je prĂ©fĂšre gĂ©rer les conflits de fusion et les maux de tĂȘte organisationnels, que les bogues invisibles causĂ©s par des mises Ă  jour mineures.

Ci-dessus dit, j'attends avec impatience tout progrĂšs sur cette question

@migueloller Des fichiers de verrouillage individuels signifient des monorepos de fils individuels. Vous ne pouvez pas avoir de fichier de verrouillage pour un espace de travail car cela brise l'uniformitĂ© des profondeurs dans le Monorepo. Si vous voulez le faire, vous vous Ă©loignez de l'idĂ©e originale de Yarn Monorepo : il s'agit d'unifier, de hisser et de rĂ©duire les profondeurs en une liste plate Ă  la racine au lieu d'avoir diffĂ©rentes versions (et mĂȘme des sous-arbres entiers) dans diffĂ©rents espaces de travail .

@the-spyke mais le problĂšme d'origine est exactement le contraire. Un fichier de verrouillage par espace de travail.

Je ne comprends pas comment vous ne pouvez pas avoir un fichier de verrouillage par espace de travail.

Cela brise l'uniformitĂ© des profondeurs dans le Monorepo? Bien sĂ»r pour le dĂ©veloppement. Mais tout le but des dĂ©pendances partagĂ©es passe par la fenĂȘtre lorsque vous devez dĂ©ployer des micro-services lĂ©gers Ă  partir de chacun de vos espaces de travail

Les deps partagés et hissés n'ont de sens que dans le développement.

Pour qu'un espace de travail vive dans Docker, il nécessite un fichier de verrouillage.

@dan-cooke Comme vous pouvez le voir , j'ai également eu ce problÚme en 2018, mais maintenant j'ai un avis différent.

Vous dites Docker et Microservices. Mais que se passe-t-il si je développe un package npm régulier ? Je n'ai pas production sous-arborescence de dépendances dependencies . Donc, ce que je veux, c'est maximiser mon expérience de développement, et c'est ce que font parfaitement Monorepos et Yarn Workspaces.

Dans le mĂȘme temps, si vous dĂ©veloppez des microservices (MS), il existe 2 situations possibles :

  1. Projets indĂ©pendants. Certains MS sont en dĂ©veloppement, d'autres n'ont pas Ă©tĂ© touchĂ©s depuis des annĂ©es. Dans ce cas, ils sont complĂštement indĂ©pendants. Il est possible d'avoir UserService utilisant [email protected] et MessagesService utilisant [email protected] . Ce n'est pas un monde facile oĂč vous associez simplement les dossiers des espaces de travail Ă  la racine node_modules . Donc, inutile d'avoir un fichier de verrouillage racine. CrĂ©ez des fichiers sĂ©parĂ©s (racines) et gĂ©rez-les indĂ©pendamment. C'est ce qu'on appelle un Multirepo dans Yarn docs. Mais maintenant, ce que vous dites, c'est "Je veux exĂ©cuter des tĂąches dans diffĂ©rents dossiers du dossier racine pour plus de commoditĂ©". Et c'est un sujet complĂštement diffĂ©rent.

  2. Les projets avec des dĂ©pendances unifiĂ©es comme Jest/Babel/etc. C'est pour cela que les espaces de travail ont Ă©tĂ© crĂ©Ă©s, mais dans les MS, il y a des exigences supplĂ©mentaires. Pendant les Ă©tapes de CI comme le linting et les tests, tout fonctionne bien car cela fonctionne de la mĂȘme maniĂšre que vous le faites sur une machine de dĂ©veloppeur : deps installĂ©s par Yarn dans les node_modules racine et aplatis. Juste en plus, vous cachez probablement la phase yarn install pour accĂ©lĂ©rer les builds simultanĂ©s.

    En production, c'est complĂštement diffĂ©rent : Ă  partir de lĂ , vous n'avez besoin que de deps pour un espace de travail et pour finir, comment installer ce package utils ? Doit-il ĂȘtre liĂ© ou tĂ©lĂ©chargĂ© en tant qu'archive ? Donc, ce dont vous avez vraiment besoin, ce n'est pas d'avoir des fichiers de verrouillage par espace de travail, mais d'avoir une commande comme yarn install --prod <workspace> que vous pouvez exĂ©cuter en spĂ©cifiant un espace de travail et elle n'installera que les services de production et en mĂȘme temps ignorera les autres espaces de travail non rĂ©fĂ©rencĂ©s. Comme si mon data WS dĂ©pend de utils WS, mais pas de logging WS, alors logging lui-mĂȘme et ses deps ne devraient pas apparaĂźtre dans node_modules . Un rĂ©sultat similaire, mais une approche complĂštement diffĂ©rente d'un "fichier de verrouillage par espace de travail".

    Si vous publiez des packages de build dans un rĂ©fĂ©rentiel (npm, Arifactory, GutHub), vous pouvez obtenir un comportement similaire en copiant simplement le fichier de verrouillage dans un espace de travail et en faisant yarn install --prod ici. Il devrait avertir des fichiers obsolĂštes, mais au lieu de le recrĂ©er Ă  partir de zĂ©ro avec de nouvelles versions, il devrait simplement en supprimer les excĂšs de deps (juste essayĂ© et semble lĂ©gitime). Devrait ĂȘtre encore meilleur et robuste avec l'utilisation de Offline Mirror.

    Et Ă  la fin, vous avez mis en Ɠuvre des espaces de travail ciblĂ©s exactement pour Multirepos.

Donc, ce que je disais, c'est que le problĂšme ne ressemble peut-ĂȘtre pas Ă  ce qu'il est.

@le-espion
J'entends ce que vous dites. Je pense que cela dĂ©pend dĂ©finitivement de la façon dont ce rĂ©sultat est obtenu. Peut-ĂȘtre qu'un fichier de verrouillage par espace de travail n'est pas rĂ©ellement le meilleur moyen d'obtenir le rĂ©sultat souhaitĂ©. Vous faites de bons points.

Ce n'est certainement pas une solution "taille unique" de toute façon

@the-spyke, tu soulĂšves de bons points. Il faut peut-ĂȘtre rĂ©flĂ©chir davantage aux problĂšmes que les espaces de travail Yarn ont Ă©tĂ© conçus pour rĂ©soudre et si son utilisation pour gĂ©rer de grands monorepos est alignĂ©e sur cette conception.

Je suis curieux de savoir comment vous résoudriez un scénario comme celui-ci :

.
└── packages
    ├── app1
    ├── app2
    ├── lib1
    ├── lib2
    └── lib3

lib3 est une bibliothĂšque partagĂ©e et dĂ©pend de app1 et app2 . lib1 n'est utilisĂ© que par app1 et lib2 n'est utilisĂ© que par app2 . D'aprĂšs vos suggestions, lib1 et app1 devraient ĂȘtre dans leur propre espace de travail avec leur propre fichier de verrouillage et il en va de mĂȘme avec lib2 et app2 . Maintenant, la question est que faire avec lib3 si _both_ app1 et app2 dĂ©pendent ? Peut-ĂȘtre pourrait-on faire en sorte que les deux espaces de travail ( app1 et app2 ) ajoutent lib3 Ă  leur espace de travail, puis exĂ©cutent yarn install dans chaque application ? Yarn le permet-il ? Y aurait-il des conflits si l'on voulait exĂ©cuter Ă  la fois app1 et app2 en dĂ©veloppement localement (peut-ĂȘtre que app1 est une application React et app2 une API GraphQL) ? Cela semble pouvoir fonctionner.

La prochaine question Ă  se poser serait « Comment obtient-on les avantages du levage avec cette mĂ©thode ? Par exemple, si app1 et app2 partagent beaucoup de dĂ©pendances communes, ce serait bien de les hisser. Je peux voir comment cela pourrait ĂȘtre hors de portĂ©e, cependant, et c'est un problĂšme Ă  rĂ©soudre par Yarn PnP (il ne copie pas les fichiers sur node_modules et a plutĂŽt un cache partagĂ©).

Je vais tenter le coup et je ferai un retour. Si cela finit par fonctionner, alors peut-ĂȘtre que nous utilisons mal les espaces de travail Yarn depuis le dĂ©but...

EDIT : j'ai essayé et ça marche.

J'ai changĂ© de position maintenant et je me rends compte que mĂȘme si un fichier de verrouillage individuel par espace de travail peut ĂȘtre la premiĂšre chose qui me vient Ă  l'esprit lors de la gestion d'un monorepo entier avec des espaces de travail Yarn, ce n'est peut-ĂȘtre pas la bonne question. Une meilleure question pourrait ĂȘtre "Les espaces de travail Yarn sont-ils conçus pour gĂ©rer un monorepo ?". La rĂ©ponse, comme d'habitude, est "ça dĂ©pend".

Si vous ĂȘtes Babel et que vous avez une seule Ă©quipe travaillant sur le monorepo et que tout est censĂ© changer en mĂȘme temps, alors oui, c'est pour cela que les espaces de travail Yarn ont Ă©tĂ© conçus. Mais si vous ĂȘtes une organisation avec plusieurs Ă©quipes et que vous utilisez un monorepo, vous ne voudrez probablement pas gĂ©rer l'intĂ©gralitĂ© du monorepo avec une seule racine d'espace de travail Yarn. Vous souhaitez probablement simplement utiliser le comportement par dĂ©faut de Yarn ou plusieurs racines d'espace de travail Yarn dans le monorepo. Cela sera dĂ©terminĂ© par les applications que vous crĂ©ez, le nombre d'Ă©quipes, etc.

Pour nous, il est devenu clair que pour chaque entité déployable (dans notre cas, il y a un Dockerfile), nous voulons avoir un yarn install séparé pour chacun (qu'il s'agisse d'une racine d'espace de travail ou non). Cela fournit de la clarté sur la propriété du code, permet des déploiements isolés qui se produisent à différentes cadences, résout les problÚmes de mise en cache avec les fichiers de verrouillage et Docker, etc. Il y a cependant quelques inconvénients à cela :

  • Qu'en est-il des packages node_modules dupliquĂ©s ? Il s'agit d'une classe courante de problĂšmes avec les monorepos et bien que les espaces de travail Yarn aident au levage, ce n'est pas une solution gĂ©nĂ©rale de monorepos. Il existe cependant d'autres solutions. Par exemple, Yarn PnP s'en occupe. Vous pouvez Ă©galement utiliser Lerna sans fil et utiliser l'option --hoist .
  • Qu'en est-il de l'utilitĂ© de l'exĂ©cution de la commande sur les espaces de travail pendant le dĂ©veloppement ? Encore une fois, les espaces de travail Yarn vous permettent de le faire, mais cela ne signifie pas qu'il faut faire de l'ensemble du monorepo une racine de l'espace de travail Yarn. La construction de l'outillage et des scripts nĂ©cessaires sera diffĂ©rente pour chaque Ă©quipe et dĂ©pendra de leur monorepo. Les espaces de travail de fil n'ont probablement pas Ă©tĂ© conçus comme un exĂ©cuteur de tĂąches monorepo. On pourrait essayer de plier fil des espaces de travail un peu pour faire ce travail (c. -Ă - exĂ©cuter des scripts MNP Ă  travers le monorepo en utilisant yarn workspace ... ) , mais il est important de garder Ă  l' esprit qu'une seule racine de l' espace de travail pour l'ensemble monorepo ne sera probablement pas vous donner ce dont vous avez besoin Ă  moins que vous ne soyez comme Babel, Jest, React, etc.

L'exécution d'un monorepo pose toute une série de problÚmes. Par exemple, qu'en est-il du suivi des dépendances et de la reconstruction uniquement des éléments qui ont changé pour gagner du temps dans CI ? Les espaces de travail Yarn pourraient vous aider en vous permettant d'interroger le graphique de dépendance. Lerna le fait, par exemple, pour permettre le tri topologique des commandes en cours d'exécution. Yarn v2 vous permet également d'interroger le graphique de dépendance. Le gestionnaire de packages PNPM le fait également. Mais je dirais que selon la complexité du monorepo, on peut vouloir essayer des outils conçus pour cela (pas les gestionnaires de paquets) comme Bazel , Pants , Buck , etc.

@migueloller D'aprÚs vos exigences, je vois que vous n'avez pas besoin de packages strictement indépendants ou d'autres choses exotiques, vous voulez également des installations de développeur plus minces. Dans ce cas, vous devez commencer avec Yarn Monorepo standard : une seule racine et tous les packages en tant qu'espaces de travail. Vous aurez des temps d'installation plus rapides, une utilisation du disque plus faible et app1 utilisera des liens locaux lib1 et lib3 . Le seul inconvénient sera plus souvent l'invalidation du cache CI car l'ajout d'un devDep à lib1 mettra à jour le yarn.lock partagé. Mais généralement, vous ne mettez pas à jour les dépendances si souvent que vous vous souciez beaucoup de ce compromis.

lib1 peut dĂ©pendre de lodash@^4.5.0" and lib2 may depend on lodash@^4.10.0". Dans le cas de Monorepo, vous voulez qu'une seule version de lodash soit utilisĂ©e, donc Yarn installera quelque chose de plus rĂ©cent compatible avec les deux spĂ©cificateurs comme ` [email protected] " hissĂ© Ă  la racine node_modules. Et en cas de mise Ă  jour, vous mettez Ă  jour cette seule version unifiĂ©e, de sorte que tous les espaces de travail restent toujours sur la mĂȘme page. C'est le comportement souhaitĂ©.

Il y a aussi des situations oĂč des Ă©quipes indĂ©pendantes dĂ©veloppent des projets indĂ©pendants. Dans ce cas, proj1 peut vouloir rester Ă  [email protected] avec proj2 ayant [email protected] et mettre Ă  jour cela avec leurs propres cadences. Bien sĂ»r, vous pouvez y parvenir en utilisant des spĂ©cificateurs plus stricts comme lodash@~4.5.0 , mais cela peut encore mettre Ă  jour la dĂ©pendance de 2e niveau trop tĂŽt. Donc, dans l'ensemble, ces projets peuvent ĂȘtre complĂštement indĂ©pendants, ils se trouvaient juste Ă  l'intĂ©rieur d'un rĂ©fĂ©rentiel git. Dans ce cas, il n'y a aucune raison de les lier en tant que Yarn Monorepo et d'Ă©changer l'indĂ©pendance contre un fichier de verrouillage partagĂ©. Traitez-les simplement comme ce qu'ils sont : des projets sĂ©parĂ©s avec leur vie indĂ©pendante. Et cela s'appelle Multirepo. Sous Unix, tous vos rĂ©pertoires sont sous / , mais cela ne signifie pas que tous les projets JS possibles sur votre PC doivent ĂȘtre un Monorepo :-)

La création d'une image Docker minimale possible pour une utilisation en production n'a aucun rapport avec Yarn, mais vous pouvez forcer Yarn à réutiliser un artefact de développement appelé yarn.lock et vous aider également dans cette tùche.

@the-spyke, dans cet exemple, je n'ai utilisĂ© que 3 espaces de travail, mais dans notre rĂ©fĂ©rentiel actuel, nous avons plus de 20 espaces de travail avec une combinaison de bibliothĂšques et de charges de travail dĂ©ployĂ©es pour le front-end et le back-end. La façon dont je le vois maintenant est que nous avons un monorepo (ou ce que vous appelez multirepo) oĂč il sera probablement logique d'avoir plusieurs racines d'espace de travail Yarn avec des fichiers de verrouillage indĂ©pendants. Nous pensons utiliser une unitĂ© dĂ©ployable comme unitĂ© de sĂ©paration, elle s'aligne bien avec les fichiers de verrouillage.

Je pense que pour moi, ce qui fait que cela fonctionne trĂšs bien, c'est le fait que les espaces de travail Yarn prennent en charge les chemins en dehors de la racine de l'espace de travail, mĂȘme si le billet de blog initial dit le contraire. Par exemple, vous pouvez avoir ceci :

{
  "workspaces": [
    "../lib1",
    "../lib3"
  ]
}

Nous avons le mĂȘme cas d'utilisation que @migueloller et une idĂ©e possible est que Yarn prenne en charge plusieurs ensembles d'espaces de travail, comme ceci :

{
  "workspaces": {
    "frontend-app": ["frontend", "common"],
    "backend-app": ["backend", "common"]
  }
}

Yarn conserverait deux fichiers de verrouillage supplémentaires (j'imagine que le yarn.lock existerait toujours):

.
└── monorepo/
    ├── yarn.frontend-app.lock
    ├── yarn.backend-app.lock
    └── packages/
        ├── frontend
        ├── backend
        └── common

Lors de la création d'une image Docker, par exemple pour le frontend, nous créons un contexte (par exemple via tar ) qui inclut ceci :

.
└── <Docker build context>/
    ├── yarn.frontend-app.lock
    └── packages/
        ├── frontend
        └── common

Ce à quoi je n'ai pas pensé en profondeur, c'est s'il est possible d'installer (lien dans node_modules ) les bonnes versions des dépendances si le frontend et le backend verrouillent des versions différentes. Mais purement du point de vue de haut niveau, les espaces de travail Yarn bidimensionnels sont probablement ce que nous recherchons.

(Quelque chose de similaire a également été publié ici .)

Il semble que vous n'ayez pas besoin d'un fichier de verrouillage par espace de travail, mais à la place, vous avez besoin de node_modules par espace de travail pour le déploiement

@gfortaine , si vous lisez la discussion vous vous

Il vaut peut-ĂȘtre la peine de mentionner que cela peut ĂȘtre fait dans les terres des utilisateurs. En utilisant le package @yarnpkg/lockfile , on peut analyser le fichier de verrouillage de niveau supĂ©rieur, puis en utilisant yarn workspaces info on peut dĂ©terminer les dĂ©pendances de l'espace de travail. En utilisant ces informations, ainsi que les package.json de chaque espace de travail, on peut gĂ©nĂ©rer un fichier de verrouillage par espace de travail. Ensuite, on pourrait le configurer en tant que script postinstall dans le rĂ©fĂ©rentiel pour garder ces fichiers de verrouillage individuels synchronisĂ©s avec celui de niveau supĂ©rieur.

Je pourrais essayer de construire ceci et faire rapport avec mes conclusions.

Il semble que je viens de trouver cette implémentation bien que pour pnpm : @pnpm/make-dedicated-lockfile

J'espĂšre que cela aide

Mon besoin pour ce comportement (version par espace de travail, mais avoir toujours des fichiers de verrouillage dans chaque package) est que j'ai un monorepo imbriquĂ©, oĂč un sous-arbre est entiĂšrement exportĂ© vers un autre repo, il doit donc rester indĂ©pendant. En ce moment, je suis coincĂ© avec lerna/npm et une logique personnalisĂ©e pour tenter d'Ă©galiser les versions. Ce serait bien si fil (je suppose que v2, Ă©tant donnĂ© que c'est lĂ  que se trouve le support imbriquĂ© ?)

Un script de post-installation pourrait tenter de gérer directement les fichiers de verrouillage, je suppose. Cela semble compliqué, mais ce serait bien de toute façon.

Cette page vous a été utile?
0 / 5 - 0 notes