Jak korzystać z pakietów niestandardowych

178

Próbuję utworzyć i używać niestandardowego pakietu w Go. Prawdopodobnie jest to coś bardzo oczywistego, ale nie mogę znaleźć wielu informacji na ten temat. Zasadniczo mam te dwa pliki w tym samym folderze:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Kiedy próbuję go run main.go, pojawia się ten błąd:

main.go:4:2: import "mylib": cannot find package

Próbowałem go build mylib.gonajpierw uruchomić, ale wydaje się, że nic nie robi (brak wygenerowanego pliku, brak komunikatu o błędzie). Więc masz pomysł, jak mógłbym to zrobić?

laurent
źródło
Nie ustawiłem zmiennej GOPATH, tylko GOROOT.
laurent
1
uruchom go installw katalogu mylibfirst i spróbuj ponownie.
Joe
1
Zobacz także ten wątek .
kostix
@Joe, nadal nie może działać, uruchamiając wewnątrz
polecenie

Odpowiedzi:

175

Najpierw należy przeczytać i zrozumieć dokument „Jak pisać kod w Go” .

Rzeczywista odpowiedź zależy od charakteru Twojego „niestandardowego pakietu”.

Jeśli ma to być do użytku ogólnego, rozważ zastosowanie tak zwanego „układu kodu Github” . Zasadniczo tworzysz swoją bibliotekę jako oddzielny go getprojekt tabeli.

Jeśli Twoja biblioteka jest do użytku wewnętrznego, możesz zrobić to w następujący sposób:

  1. Umieść katalog z plikami biblioteki w katalogu swojego projektu.
  2. W pozostałej części projektu odwołaj się do biblioteki, używając jej ścieżki względem katalogu głównego obszaru roboczego zawierającego projekt.

Aby zademonstrować:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Teraz na najwyższym poziomie main.gomożesz import "myproject/mylib"i będzie dobrze.

kostix
źródło
1
Jeśli utworzę nowy projekt (myproject2) w src /, jak mogę zaimportować mylib?
Kiril,
2
@Kiril, masz na myśli, jak importujesz mylibw kodzie myproject2? Wtedy odpowiedź brzmi "używając import "myproject/mylib"- idea jest taka, że ​​Go wyszukuje zaimportowane ścieżki w każdym katalogu, który wyodrębnia ze GOPATHzmiennej środowiskowej (nazywane są one" obszarami roboczymi "), ale to wyszukiwanie nie jest (na szczęście) rekurencyjne, więc takie ścieżki są skutecznie "zakotwiczone" w swoich miejscach pracy
kostix
4
Kolejna pozycja obowiązkowa: „Nazwy pakietów” .
kostix
1
@MatthiasSommer, zazwyczaj - przez wyodrębnienie tej mylib do wspólnego pakietu używanego przez każdą mikrousługę. Dokładny sposób definiowania „zastosowań” zależy od preferowanego przepływu pracy. W programowaniu klasy korporacyjnej zwykle stosuje się sprzedawanie , ale w przypadku ostatnich go modzmian rozwiązaniem może być moduł (i go modobsługuje również sprzedaż modułów).
kostix
1
@LeiYang, „pakiet do zaimportowania” to katalog zawierający jeden lub więcej plików źródłowych Go. Jeśli chodzi o „jak zbudować pakiet do pliku .lib”, a następnie zaimportować plik lib ”- odpowiedź zależy od tego, o co naprawdę zamierzałeś zapytać. Jeśli martwisz się szybkością kompilacji, nie obawiaj się: pamięć podręczna łańcucha narzędzi Go wszystkie wyniki kompilacji dla poszczególnych pakietów. Jeśli zamiast tego chciałbyś zapytać, czy można skompilować i rozpowszechnić skompilowany pakiet tylko binarny, to odpowiedź brzmi nie .
kostix
68

W przypadku tego rodzaju struktury folderów:

main.go
mylib/
  mylib.go

Najprostszym sposobem jest użycie tego:

import (
    "./mylib"
)
laurent
źródło
1
To już nie działa w ostatnich wersjach go, ponieważ pakiet nie zostanie znaleziony. Poprawny import byłby foo/mylib(zakładając, że folder zawierający main.go jest foo).
nemo
6
@nemo, w najnowszej wersji go zawsze używam „./mylib” i to działa.
laurent
3
Używając go 1.2 i zgadzam się z @ this.lau_
canadadry
8
Pamiętaj, że to powoduje go installzerwanie. Jeśli tworzysz samodzielny projekt, który chcesz, aby ludzie mogli go pobierać i uruchamiać go build, jest to w porządku - jednak użyłbym wspomnianego powyżej „układu kodu Github” (nawet jeśli nie jest to Bitbucket lub podobny), jeśli chcesz mieć pełne go installwsparcie .
fotojonizowane
Nie używaj tego w ten sposób. To złamie Godef. godef, nie rozumie "." import
King Jk
6

Oto, co zwykle robią ludzie w przypadku projektu hostowanego na GitHubie

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...
laike9m
źródło
6

Jestem doświadczonym programistą, ale całkiem nowy w świecie Go! I przyznaję, że miałem kilka trudności ze zrozumieniem Go… Napotkałem ten sam problem, próbując uporządkować moje pliki go w podfolderach. Sposób, w jaki to zrobiłem:

GO_Directory (ten przypisany do $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

W pliku MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

w pliku MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(Używam Go 1.9 na Ubuntu 16.04)

I pamiętajcie, jestem nowicjuszem w Go. Jeśli to, co robię, jest złą praktyką, daj mi znać!

Diego Favero
źródło
3

inne rozwiązanie:
dodaj src/myprojectdo $ GOPATH.

Następnie import "mylib"skompiluje.

Helin Wang
źródło
to nie zadziała dla ścieżek go gettable, takich jak pakiety hostowane na github.
Gustav