2013-01-11 3 views
15

Buduję bibliotekę, ale chcę również, aby była ona użyteczna jako samodzielny plik binarny.Czy mogę mieć bibliotekę i plik binarny o tej samej nazwie?

Na przykład, powiedzmy, że buduję implementację Tar. Tar jest powszechnie używany jako polecenie, ale może być również używany jako biblioteka. Intuicyjnie, zrobiłbym coś takiego:

src/ 
    tar/ 
     tar.go # belongs to package tar 
     main.go # imports tar and provides a main function 

To jednak nie działa. Z wersji documentation wynika, że ​​"polecenia" powinny mieć oddzielną nazwę od biblioteki. Adaptacja przykład podany jest na tym przykładzie, mam następującą strukturę katalogów:

src/ 
    tar/ 
     tar.go # belongs to package tar 
    tarbin/ 
     main.go # imports tar and provides a main function 

Jednak ta tworzy polecenie o nazwie tarbin, nie tar w $GOPATH/bin. Obejście, które znalazłem, to wykonanie go build -o $GOPATH/bin/tar tar, ale mam wrażenie, że robię coś okropnie nie tak. Czy istnieje lepszy sposób?

Uwaga: Mam świadomość, że tar jest zawarty w standardowych bibliotekach, używam go tylko jako przykładu.

Odpowiedz

21

pewnie bym to zrobić

src/ 
    tar/ 
     tar.go   # tar libary 
     tar/ 
      main.go # tar binary 

To daje binarny o nazwie tar i bibliotekę o nazwie tar

Powiedzmy jesteś gospodarzem tego na github wtedy chciałby

src/ 
    github.com/ 
     you/ 
      tar/ 
       tar.go   # tar libary 
       tar/ 
        main.go # tar binary 

Który dałby ci plik binarny o nazwie tar, gdy robisz go get install github.com/you/tar/tar i bibliotekę o nazwie github.com/you/tar, gdy robisz go get install github.com/you/tar

zależności od czujesz jest ważniejsza można zamienić bibliotekę oraz binarny nad

src/ 
    github.com/ 
     you/ 
      tar/ 
       main.go   # tar binary 
       tar/ 
        tar.go   # tar libary 

Prowadzenie cały kod w jednym drzewie pozwala zrobić go install ./... od korzenia do budowania wszystkie pakiety i podpakiety, co jest zaletą. go test|fmt ./... również. (Zauważ, że naprawdę są to 3 kropki!)

+0

Awesome! Podoba mi się to znacznie lepiej niż moje 'go build -o ...' hack ... – tjameson

+0

Z wyjątkiem "go build" nie powiedzie się, ponieważ twój plik binarny nazwałby to samo, co katalog lokalny ("tar"). Musisz użyć "go-build" w tym przypadku. – Gravis

+0

@Gravis Widzę, co masz na myśli. Jednak "go install" jest tym, czego chcesz użyć do budowania binarnego - prawie nigdy nie używaj 'go build', ponieważ nie buforuje kompilacji. Zmienię odpowiedź, aby usunąć odniesienie do 'go build'. –