2015-06-29 2 views
0

Возможно, я ошибаюсь (я прочитал «Как писать код перехода»), но вот чего я пытаюсь достичь: хочу написать пакет golang, который также поставляется с CLI, так что пользователь может использовать пакет в своих собственных программах, но также использовать CLI, который я создал с ним.Building CLI app/package в Go

Так что я до сих пор эта структура:

mypackage/ 
    -api/ 
    -account.go // package api 
    -node.go // package api 
    -main.go // package main - this is where I want 
      // the executable code to be that is put in the `bin` folder. 

Это структура очень сырой файл, как я только начинал проект, но это то, что я пытаюсь достичь, а не строить пакет с полезным кодом в нем, а затем создать отдельное репо с моим CLI в нем. Но когда я пытаюсь запустить main.go, он говорит undefined: Account (который является структурой в account.go).

Содержимое моего кода не имеет значения прямо сейчас, это очень просто, поскольку я просто пытаюсь заставить код работать. Вот что у меня есть.

account.go

package api 

import (
    "io/ioutil" 
    "net/http" 
) 

type Account struct { 
    email   string 
} 

main.go

package main 

import (
    "github.com/username/mypackage/api" 
    "fmt" 
) 

func main() { 
    a := Account{} 

    fmt.Printf("%T", a) 
} 

Если это совершенно плохая практика, я полагаю, я просто сделать 2 операции РЕПО, один с CLI, а другой с моей фактической код пакета (опять же, можно использовать в разработке другими путем импорта), но мне бы очень хотелось, чтобы это было все-в-одном репо.

+4

'' '' '' находится в пакете 'api', поэтому вы ссылаетесь на него как' api.Account' – JimB

+0

Ух ты ... определенно передумал все и пропустил это ... Вот и все. Благодаря! –

+0

'api' - [плохое имя для пакета] (https://blog.golang.org/package-names), тем более, что вы явно упоминаете других пользователей, использующих ваш пакет. –

ответ

3

Там нет «один путь», но общий подход, чтобы сделать ваш верхнего уровня репо в вашей библиотеке - т.е. github.com/you/somelib, а затем есть каталог cmd под который содержит ваш CLI (пакет от сети) - может быть даже много.

например.

yourlib/ 
    api.go 
    api_test.go 
    handler.go 
    handler_test.go 
    cmd/ 
     command-name/ 
      main.go // Builds a "command-name" binary 
     other-command/ 
      main.go // Builds a "other-command" binary 

Ваши приложения для CLI - это просто пользователи вашей библиотеки. Пользователи могут получить его через go get github.com/you/yourlib/..., который установит lib и двоичные файлы на свой GOPATH.

The Go source itself, Camlistore и BoltDB все используют этот подход (среди многих других библиотек).

+0

Итак, чтобы уточнить, что-нибудь в пакете «main» и «main» func будет добавлено в качестве исполняемого файла в каталоге bin? –

+0

Правильно - он будет добавлен в '$ GOPATH/bin', когда вы используете' go get' для извлечения пакета. – elithrar