วิธีใช้แพ็คเกจที่กำหนดเอง


178

ฉันกำลังพยายามสร้างและใช้แพ็คเกจที่กำหนดเองใน Go อาจเป็นสิ่งที่ชัดเจนมาก แต่ฉันไม่สามารถหาข้อมูลเกี่ยวกับเรื่องนี้ได้มากนัก โดยทั่วไปฉันมีไฟล์สองไฟล์นี้ในโฟลเดอร์เดียวกัน:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

เมื่อฉันพยายามgo run main.goฉันได้รับข้อผิดพลาดนี้:

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

ฉันพยายามเรียกใช้go build mylib.goก่อน แต่ดูเหมือนจะไม่ทำอะไรเลย (ไม่มีไฟล์ที่สร้างขึ้นไม่มีข้อความแสดงข้อผิดพลาด) ดังนั้นความคิดใดที่ฉันสามารถทำได้


ฉันไม่ได้ตั้งค่าตัวแปร GOPATH เพียง GOROOT
เรน

1
เรียกใช้go installภายใต้ไดเรกทอรีmylibแรกแล้วลองอีกครั้ง
โจ

1
ดูเพิ่มเติมที่หัวข้อนี้
kostix

@ โจมันไม่สามารถทำงานได้โดยการเรียกใช้ "ไปติดตั้ง" ภายใน
hunter_tech

คำตอบ:


175

ก่อนอื่นให้แน่ใจว่าได้อ่านและทำความเข้าใจกับ"วิธีเขียนโค้ด Go"เอกสาร

คำตอบที่แท้จริงขึ้นอยู่กับลักษณะของ "แพ็คเกจที่กำหนดเอง" ของคุณ

ถ้ามันตั้งใจจะเป็นของการใช้งานทั่วไปพิจารณาจ้างที่เรียกว่า"รูปแบบรหัส Github" โดยพื้นฐานแล้วคุณทำให้ห้องสมุดของคุณแยกจากกันgo getโครงการตาราง

หากห้องสมุดของคุณมีไว้สำหรับใช้ภายในคุณสามารถทำสิ่งนี้ได้:

  1. วางไดเรกทอรีพร้อมไฟล์ไลบรารีภายใต้ไดเรกทอรีของโครงการของคุณ
  2. ในส่วนที่เหลือของโครงการของคุณอ้างถึงห้องสมุดโดยใช้เส้นทางที่เกี่ยวข้องกับรากของพื้นที่ทำงานของคุณที่มีโครงการ

เพื่อสาธิต:

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

ทีนี้ในระดับบนสุดmain.goคุณทำได้import "myproject/mylib"และมันก็ใช้ได้ดี


1
หากฉันสร้างโครงการใหม่ (myproject2) ภายใต้ src / ฉันจะนำเข้า mylib ได้อย่างไร
คิริล

2
@ คิริลคุณหมายถึงคุณนำเข้าอย่างไรmylibในรหัสของmyproject2? จากนั้นคำตอบคือ "โดยใช้import "myproject/mylib"- แนวคิดคือ Go ค้นหาพา ธ ที่นำเข้าภายใต้แต่ละไดเร็กทอรีที่แยกออกจากGOPATHตัวแปรสภาพแวดล้อม (เรียกว่า" เวิร์กสเปซ ") แต่การค้นหานี้ (โชคดี) ไม่ใช่แบบเวียนเกิดขึ้น ได้อย่างมีประสิทธิภาพ "ทอดสมอ" ที่พื้นที่ทำงานของตน
kostix

4
ต้องมีอีกอ่าน: "ชื่อแพ็กเกจ"
kostix

1
@MatthiasSommer โดยทั่วไปแล้ว - โดยแยก mylib นั้นลงในแพ็คเกจทั่วไปที่ microservice ใช้ วิธีการกำหนด "ใช้" อย่างแน่นอนขึ้นอยู่กับเวิร์กโฟลว์ที่คุณต้องการ ในการพัฒนาระดับองค์กรการขายโดยทั่วไปจะใช้ แต่ด้วยการgo modพัฒนาล่าสุดโมดูลอาจเป็นคำตอบ (และgo modสนับสนุนการขายโมดูลเช่นกัน)
kostix

1
@LeiYang "แพ็คเกจที่จะนำเข้า" เป็นไดเรกทอรีที่มีไฟล์ต้นทางอย่างน้อยหนึ่งไฟล์ สำหรับ "วิธีสร้างแพ็คเกจไปยังไฟล์. lib" จากนั้นจึงนำเข้าไฟล์ lib "- คำตอบนั้นขึ้นอยู่กับสิ่งที่คุณตั้งใจจะขอจริงๆถ้าคุณกังวลเรื่องความเร็วในการคอมไพล์ . ทั้งหมดสร้างผลบนพื้นฐานต่อแพคเกจหาก แต่คุณอยากจะถามว่ามันเป็นไปได้ที่จะรวบรวมและจัดจำหน่ายแพคเกจไบนารีเท่านั้นรวบรวมแล้วคำตอบคือไม่มี .
kostix

68

สำหรับโครงสร้างโฟลเดอร์ชนิดนี้:

main.go
mylib/
  mylib.go

วิธีที่ง่ายที่สุดคือใช้สิ่งนี้:

import (
    "./mylib"
)

1
สิ่งนี้ไม่ทำงานอีกต่อไปในเวอร์ชันล่าสุดเนื่องจากไม่พบแพ็คเกจ การนำเข้าที่ถูกต้องจะเป็นfoo/mylib(สมมติว่าโฟลเดอร์ที่มี main.go คือfoo)
nemo

6
@nemo ด้วยเวอร์ชันล่าสุดของ go ฉันมักจะใช้ "./mylib" และใช้งานได้
Laurent

3
ใช้ go 1.2 และฉันเห็นด้วยกับ @ this.lau_
canadadry

8
ระวังว่านี่จะgo installหยุดพัก หากคุณกำลังสร้างโปรเจ็กต์แบบสแตนด์อโลนที่คุณต้องการให้ผู้คนดาวน์โหลดและใช้go buildงานนี่เป็นเรื่องปกติ - แต่ฉันจะใช้ "เลย์เอาต์รหัส Github" ที่กล่าวถึงข้างต้น (แม้ว่าจะปิด bitbucket หรือคล้ายกัน) หากคุณต้องการgo installการสนับสนุนอย่างเต็มที่.
photoionized

ฉันแนะนำไม่ใช้วิธีนี้ มันจะทำลาย godef godef มันไม่เข้าใจเกี่ยวกับ "." นำเข้า
King Jk

6

สำหรับโครงการที่โฮสต์ใน GitHub นี่คือสิ่งที่ผู้คนมักทำ:

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

mylib.go

package mylib

...

main.go

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

...

6

ฉันเป็นโปรแกรมเมอร์ที่มีประสบการณ์ แต่ค่อนข้างใหม่ในโลก Go! และฉันยอมรับว่าฉันต้องเผชิญกับความยากลำบากในการเข้าใจ Go ... ฉันประสบปัญหาเดียวกันนี้เมื่อพยายามจัดระเบียบไฟล์ go ของฉันในโฟลเดอร์ย่อย วิธีที่ฉันทำ:

GO_Directory (อันที่กำหนดให้กับ $ 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

ในไฟล์ MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

ในไฟล์ 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
}

(ฉันใช้ Go 1.9 บน Ubuntu 16.04)

และจำได้ว่าฉันเป็นมือใหม่ในการเดินทาง หากสิ่งที่ฉันทำคือการปฏิบัติที่ไม่ดีโปรดแจ้งให้เราทราบ!


3

อีกวิธีแก้ไข:
เพิ่มsrc/myprojectใน $ GOPATH

จากนั้นimport "mylib"จะรวบรวม


สิ่งนี้จะไม่ทำงานสำหรับเส้นทาง gettable เช่นแพคเกจโฮสต์ github
กุสตาฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.