138 votes

Utilisation de l'importation de paquets en fourche dans Go

Supposons que vous ayez un référentiel à github.com/someone/repo et vous le bifurquez vers github.com/you/repo . Vous voulez utiliser votre fork au lieu du repo principal, donc vous faites un

go get github.com/you/repo

Maintenant, tous les chemins d'importation dans ce dépôt seront "cassés", ce qui signifie que s'il y a plusieurs paquets dans le dépôt qui se réfèrent les uns aux autres via des URLs absolues, ils référenceront la source, et non la bifurcation.

Existe-t-il un meilleur moyen que de le cloner manuellement dans le bon chemin ?

git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo

2voto

Steven Penny Points 18523

Au lieu de cloner à un endroit précis, vous pouvez cloner où vous voulez. Ensuite, vous pouvez exécuter une commande comme celle-ci, pour que Go fasse référence à la version locale :

go mod edit -replace github.com/owner/repo=../repo

https://golang.org/cmd/go#hdr-Module_maintenance

1voto

Jeremy Wall Points 10643

La réponse à cette question est que si vous créez un dépôt avec plusieurs paquets, vous devrez renommer tous les chemins d'importation pertinents. C'est en grande partie une bonne chose puisque vous avez forké tous ces paquets et les chemins d'importation devraient le refléter.

0voto

Tim Abell Points 2301

Utiliser les vendeurs et les submodules ensemble

  1. Fork la librairie sur github (go-mssqldb dans ce cas)
  2. Ajouter un sous-module qui clone votre fourchette dans votre dossier du vendeur mais a le chemin du dépôt amont
  3. Mettez à jour votre import dans votre code source pour qu'il pointe vers le dossier du fournisseur (sans inclure le dossier du fournisseur). vendor/ préfixe). Par exemple vendor/bob/lib => import "bob/lib"

Par exemple

cd ~/go/src/github.com/myproj

mygithubuser=timabell
upstreamgithubuser=denisenkom
librepo=go-mssqldb

git submodule add "git@github.com:$mygithubuser/$librepo" "vendor/$upstreamgithubuser/$librepo"

Pourquoi

Cela permet de résoudre todo les problèmes dont j'ai entendu parler et que j'ai rencontrés en essayant de résoudre moi-même ce problème.

  • Les références de paquets internes dans la bibliothèque fonctionnent maintenant parce que le chemin est inchangé par rapport à l'amont.
  • Un nouveau checkout de votre projet fonctionne parce que le système de submodule le reçoit de votre fork au bon commit mais dans le chemin du dossier amont
  • Vous n'avez pas besoin de savoir comment modifier manuellement les chemins d'accès ou de manipuler l'outillage.

Plus d'informations

0voto

Rob Points 468

La réponse moderne (à partir de la version 1.15, au moins).

go mod init github.com/theirs/repo

Faire un arg init explicite qui est le nom des paquets ORIGINAUX. Si vous n'incluez pas le nom du repo, il prendra celui de gopath. Mais lorsque vous utilisez des modules go, ils ne se soucient plus de l'endroit où ils se trouvent sur le disque, ni de l'endroit d'où git tire réellement les dépendances.

-1voto

heralight Points 111

Pour automatiser ce processus, j'ai écrit un petit script. Vous pouvez trouver plus de détails sur mon blog pour ajouter une commande comme "gofork" à votre bash.

function gofork() {
  if [ $# -ne 2 ] || [ -z "$1" ] || [ -z "$2" ]; then
    echo 'Usage: gofork yourFork originalModule'
    echo 'Example: gofork github.com/YourName/go-contrib github.com/heirko/go-contrib'
    return
  fi
   echo "Go get fork $1 and replace $2 in GOPATH: $GOPATH"
   go get $1
   go get $2
   currentDir=$PWD
   cd $GOPATH/src/$1
   remote1=$(git config --get remote.origin.url)
   cd $GOPATH/src/$2
   remote2=$(git config --get remote.origin.url)
   cd $currentDir
   rm -rf $GOPATH/src/$2
   mv $GOPATH/src/$1 $GOPATH/src/$2
   cd $GOPATH/src/$2
   git remote add their $remote2
   echo Now in $GOPATH/src/$2 origin remote is $remote1
   echo And in $GOPATH/src/$2 their remote is $remote2
   cd $currentDir
}

export -f gofork

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X