2013-12-06 4 views
9

Хорошо, у меня есть проект, который предоставляет библиотеку (экспортирует некоторые функции), а также должен предоставлять интерфейс командной строки (должен быть исполняемый файл).Имеет ли смысл иметь два пакета в одном каталоге? (golang)

Пример структуры каталогов:

whatever.io/ 
    myproject/ 
     main.go 
     myproject.go 

хода компилятору нужен пакета основного и FUNC основного начать выполнение. Моей библиотеке нужен пакет myproject, где я помещал вещи на него. Это то, что говорит инструмент идти, когда я строю еще один проект, который пытается импортировать MyProject:

main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject 

Так я считаю, что нет никакого способа сделать это.

Должен ли я переместить библиотеку или CLI в другой пакет?

ответ

12

Просто переместите пакеты в новую папку внутри той же директории main.go. Не забудьте импортировать новый пакет из ссылки $ GOPATH.

Пример:

[email protected]:~/p/go/test/so-multipack$ ls -R 
.: 
a main.go 

./a: 
a.go 
[email protected]:~/p/go/test/so-multipack$ cat main.go 
package main 

import (
    "../so-multipack/a" 
) 
func main(){ 
    a.Hello() 
} 
[email protected]:~/p/go/test/so-multipack$ cat a/a.go 
package a 
import (
    "fmt" 
) 
func Hello(){ 
    fmt.Println("hello from a") 
} 
[email protected]:~/p/go/test/so-multipack$ go run main.go 
hello from a 
[email protected]:~/p/go/test/so-multipack$ go build 
[email protected]:~/p/go/test/so-multipack$ ls 
a main.go so-multipack 
[email protected]:~/p/go/test/so-multipack$ 

Полезная ссылка:

go build vs go build file.go

+0

Так что в принципе да, я должен его переместить. Благодарю. – xrash

+0

@xrash, но, пожалуйста, подумайте о том, чтобы изменить импорт в коде вашей команды на 'whatever.io/myproject' - не использовать относительный импорт (см. [Это обсуждение] (http://stackoverflow.com/q/10687627/720999), например, и указатели, которые он содержит). – kostix

+0

Относительные пути одобрены только в том случае, если каждый пакет находится в пределах их собственного каталога и ссылается на GOPATH. В противном случае 'go build' может завершиться ошибкой. –

7

Вы не можете иметь два пакета в одном каталоге, отсюда и ошибки. Таким образом, решение, как @Larry Battle сказал, чтобы переместить ваш myproject.go в новый каталог.

От How to write go code

код Go должен быть внутри рабочей области. Рабочая область представляет собой каталог иерархии с тремя каталогов в корне:

ЦСИ содержит Go исходных файлов, организованных в пакеты (один пакет на каталог),

упак содержит объекты пакета и

бен содержит исполняемые команды.

+2

Есть исключение https://github.com/golang/go/blob/master/ ЦСИ/время/example_test.go – themihai

Смежные вопросы