Özel paketler nasıl kullanılır?


178

Go'da özel bir paket oluşturmaya ve kullanmaya çalışıyorum. Muhtemelen çok açık bir şey ama bu konuda fazla bilgi bulamıyorum. Temel olarak, aynı klasörde şu iki dosya var:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Ne zaman denemek go run main.go, bu hatayı alıyorum:

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

go build mylib.goİlk çalıştırmayı denedim ama hiçbir şey yapıyor gibi görünmüyor (dosya oluşturulmadı, hata mesajı yok). Peki bunu nasıl yapabileceğime dair bir fikrin var mı?


Bir GOPATH değişkeni belirlemedim, sadece GOROOT.
laurent

1
ilk go installdizin altında çalıştırın mylibve tekrar deneyin.
Joe

1
Bu konuya da bakınız .
kostix

@Joe, hala içinde "go install" çalıştırarak çalışamaz
hunter_tech

Yanıtlar:


175

İlk olarak, "Go kodu nasıl yazılır" belgesini okuduğunuzdan ve anladığınızdan emin olun .

Gerçek cevap, "özel paketinizin" niteliğine bağlıdır.

Genel kullanım amaçlıysa , "Github kod düzeni" ni kullanmayı düşünün . Temel olarak, kitaplığınızı ayrı bir go gettablo haline getirirsiniz .

Kütüphaneniz dahili kullanım içinse, şu şekilde gidebilirsiniz:

  1. Kütüphane dosyaları içeren dizini projenizin dizininin altına yerleştirin.
  2. Projenizin geri kalanında, projeyi içeren çalışma alanınızın köküne göre yolunu kullanarak kütüphaneye bakın.

Göstermek:

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

Şimdi, üst düzeyde main.go, yapabilirdiniz import "myproject/mylib"ve işe yarayacaktı.


1
Src / altında yeni bir proje (myproject2) oluşturursam mylib'i nasıl alabilirim?
Kiril

2
@Kiril, yani, mylibkoduna nasıl aktarıyorsunuz myproject2? Daha sonra cevap "kullanarak import "myproject/mylib"- fikir, Go'nun GOPATHortam değişkeninden ayıkladığı her dizinin altındaki içe aktarılan yolları arar (" çalışma alanları "olarak adlandırılır), ancak bu arama (neyse ki) özyinelemeli değildir, bu nedenle bu yollar ilgili çalışma alanlarına etkin bir şekilde "ankrajlandı"
kostix

4
Başka bir okunması gereken: "Paket adları" .
kostix

1
@MatthiasSommer, tipik olarak - her bir mikro hizmetin kullandığı mylib'i ortak bir pakete çıkararak. "Kullanımların" tam olarak nasıl tanımlandığı, tercih ettiğiniz iş akışına bağlıdır. Kurumsal düzeyde geliştirmede, satıcılık genellikle kullanılır, ancak son go modgelişmelerle birlikte bir modül yanıt olabilir (ve go modmodüllerin satıcılığını da destekler).
kostix

1
@LeiYang, "içe aktarılacak paket" bir veya daha fazla Go kaynak dosyası içeren bir dizindir. "Bir .lib dosyasına nasıl paket oluşturulacağına" ve sonra lib dosyasını içe aktaracağına "gelince, cevap gerçekten ne istediğine bağlıdır. Derleme hızıyla ilgileniyorsanız, korkmayın: Git araç zinciri önbellekleri . her paket bazında tüm yapı sonuçları, bunun yerine, bunu derlemek mümkün olmadığını sormak istedim ve bir ikili okunur derlenmiş paketi dağıtmak, sonra cevap hayır .
kostix

68

Bu tür klasör yapısı için:

main.go
mylib/
  mylib.go

En basit yol bunu kullanmaktır:

import (
    "./mylib"
)

1
Paket bulunmayacağından, go'nun son sürümlerinde artık çalışmaz. Doğru içe aktarma foo/mylib(main.go içeren klasör olduğu varsayılarak foo) olur.
nemo

6
@nemo, go'nun en son sürümü ile her zaman "./mylib" kullanıyorum ve işe yarıyor.
laurent

3
Go 1.2 kullanarak ve @ this.lau_
Kanadalı

8
Bunun go installmola verdiğini unutmayın . İnsanların indirmesini ve çalıştırmasını istediğiniz bağımsız bir proje oluşturuyorsanız go build, bu iyi - ancak, tam go installdestek istiyorsanız, yukarıda belirtilen "Github kod düzenini" (bitbucket veya benzeri olsa bile) kullanırdım .
photoionized

Bu şekilde kullanmayın. Godef'i kıracak. godef "." hakkında anlamıyor. ithalat
Kral Jk

6

GitHub'da barındırılan bir proje için, insanların genellikle yaptıkları :

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

mylib.go

package mylib

...

main.go

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

...

6

Deneyimli bir programcıyım, ama Go dünyasında oldukça yeniyim! Ve itiraf ediyorum Go'yu anlamak için birkaç zorlukla karşılaştım ... Go dosyalarımı alt klasörlerde düzenlemeye çalışırken de aynı sorunla karşılaştım. Yaptığım yol:

GO_Directory ($ GOPATH değerine atanmış olan)

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

Dosyada Projem \ Varlıklar \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

MyProject \ main.go dosyasında

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

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

    // do your things here
}

(Ubuntu 16.04'te Go 1.9'u çalıştırıyorum)

Ve unutmayın arkadaşlar, ben Go'da acemi oldum. Eğer yaptığım kötü uygulama ise, bana bildirin!


3

başka bir çözüm:
eklesrc/myproject $ GOPATH'a .

Sonra import "mylib"derler.


bu, github tarafından barındırılan paketler gibi go gettable yolları için çalışmaz.
Gustav
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.