Могу ли я иметь библиотеку и двоичные файлы с тем же именем?

Я создаю библиотеку, но я также хочу, чтобы ее можно было использовать в качестве автономного двоичного файла.

Например, скажем, я строю реализацию Tar. Тар обычно используется как команда, но его также можно использовать в качестве библиотеки. Интуитивно я бы сделал что-то вроде этого:

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

Это, похоже, не работает. Из документации кажется, что "команды" должны иметь отдельное имя из библиотеки. Адаптируя пример, приведенный в этом примере, у меня есть следующая структура каталогов:

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

Однако это создает команду tarbin, а не tar в $GOPATH/bin. Обходной путь, который я нашел, - это сделать go build -o $GOPATH/bin/tar tar, но я чувствую, что делаю что-то ужасно неправильно. Есть ли лучший способ?

Примечание: Я хорошо знаю, что tar включен в стандартные библиотеки, я использую его только как пример.

Ответы

Ответ 1

Я бы, наверное, сделал это

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

Это даст вам двоичный код tar и библиотеку с именем tar

Скажем, вы размещаете это на github, тогда вы хотите

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

Что бы вы дали двоичный код tar, когда вы делаете go get install github.com/you/tar/tar и библиотеку под названием github.com/you/tar, когда вы делаете go get install github.com/you/tar

В зависимости от того, что вы считаете более важным, вы можете обменять библиотеку и двоичный файл на

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

Сохранение всего кода в одном дереве позволяет вам сделать go install ./... из корня для создания всех пакетов и подпакетов, что является преимуществом. go test|fmt ./.... (Обратите внимание, что на самом деле это 3 точки!)