Как скомпилировать программу Go, состоящую из нескольких файлов?


88

У меня есть небольшая программа, состоящая из трех файлов, принадлежащих одному пакету (главному), но когда я делаю «go build main.go», сборка не выполняется. Когда это был всего один файл (main.go), все работало нормально. Теперь, когда я приложил некоторые усилия, чтобы разделить код, похоже, что компилятор не может найти материал, который был взят из main.go и помещен в эти два других файла (которые находятся в том же каталоге, что и main.go) . Что приводит к ошибкам "неопределенного типа".

Как скомпилировать эту программу, состоящую из нескольких файлов?

Ответы:


86

Новый способ ( рекомендуется ):

Пожалуйста, взгляните на этот ответ .

Старый способ:

Предположим, вы пишете программу под названием myprog:

Поместите все свои файлы в такой каталог

myproject/go/src/myprog/xxx.go

Затем добавьте myproject/goв GOPATH

И беги

go install myprog

Таким образом, вы сможете добавлять другие пакеты и программы в myproject / go / src, если хотите.

Ссылка: http://golang.org/doc/code.html

(этот документ всегда пропускают новички и часто сначала плохо понимают. Ему следует уделять самое пристальное внимание со стороны команды Go IMO)


5
почему бы не избавиться от / go / и просто сделать myproject / src?
Александр Миллс

Кроме того, я предполагаю, что "go install myprog" каким-то образом записывает источник проекта в папку $ GOPATH? Это правильно? если так, было бы неплохо, если бы это объяснение также было частью ответа
Александр Миллс

1
@AlexanderMills Только небольшие проекты используют только одну технологию.
Denys Séguret

2
@ DenysSéguret не уверен, что я согласен с этим, но в любом случае это для простых проектов, вы можете просто отказаться от части go - люди могут подумать, что вещь go необходима, а это не так. Вы скажете мне, что проще, пойти или нет? :)
Александр Миллс

1
Я до сих пор не понимаю, почему такая структура папок?
Мадео

67

main.goНапример more.go, когда вы отделяете код от в , вы просто передаете этот файл в go build/ go run/ go install.

Итак, если вы ранее запускали

go build main.go

ты сейчас просто

go build main.go more.go

В качестве дополнительной информации:

go build --help

состояния:

Если аргументы представляют собой список файлов .go, build рассматривает их как список исходных файлов, определяющих один пакет.


Обратите внимание, что go buildи go installотличается от go runтого, что первые два состояния ожидают имена пакетов в качестве аргументов, а последнее ожидает файлы go . Однако первые два также принимают файлы go, как и go install.

Если вам интересно: build будет содержать только buildпакеты / файлы, installсоздаст объектные и двоичные файлы в вашем GOPATH, а runтакже скомпилирует и запустит вашу программу.


6
Если вы не хотите добавлять все больше и больше файлов, используйте регулярное выражение с: go run * .go
NateW

хорошо, спасибо, Go всегда записывает только один исполняемый файл? Он не разделяет исполняемые файлы (как в Java)?
Alexander Mills

@AlexanderMills из-за окон, я думаю, используйте nix. или хотя бы mingw.
Сергей Горланов

да, я использовал MacOS, но, возможно, это
Александр Миллс

30

Вы также можете просто запустить

go build

в папке вашего проекта myproject / go / src / myprog

Затем вы можете просто ввести

./myprog

запустить ваше приложение


3
вывод - это объект go, а не исполняемый файл.
user2284570

@ user2284570 просто добавьте chmod +xразрешение для этого файла на его запуск
dalmate

19

Начиная с Go 1.11+, GOPATH больше не рекомендуется, новый способ - использовать модули Go.

Допустим, вы пишете программу под названием simple:

  1. Создайте каталог:

    mkdir simple
    cd simple
    
  2. Создайте новый модуль:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. Поместите все свои файлы в этот каталог.

  4. Наконец, запустите:

    go run .
    
  5. В качестве альтернативы вы можете создать исполняемую программу, построив ее:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

Для получения дополнительной информации вы можете прочитать это .

Go включает поддержку версионных модулей, как это предлагается здесь, начиная с 1.11. Первоначальный прототип vgo был анонсирован в феврале 2018 года. В июле 2018 года модули с поддержкой версий появились в основном репозитории Go. В Go 1.14 поддержка модулей считается готовой к производственному использованию, и всем пользователям предлагается перейти на модули из других систем управления зависимостями.


7

Ты можешь использовать

go build *.go 
go run *.go

оба будут работать, также вы можете использовать

go build .
go run .

5

Это зависит от структуры вашего проекта. Но самое простое:

go build ./... -o ./myproject

затем беги ./myproject.

Предположим, структура вашего проекта выглядит так

- hello
|- main.go

тогда вы просто переходите в каталог проекта и запускаете

go build -o ./myproject

затем запустите ./myprojectоболочку.

или

# most easiest; builds and run simultaneously
go run main.go

предположим, что ваш основной файл вложен в подкаталог, например cmd

- hello
|- cmd
 |- main.go

тогда ты побежишь

go run cmd/main.go

3

Ага! Это очень просто, и здесь в игру вступает пакетная стратегия. насколько мне известно, есть три пути. структура папок:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 предупреждение: адаптер может содержать каталоги main only и sun для пакетов

  1. перейдите в папку «адаптер». Бегать:
    go build main.go
  1. перейдите в папку «адаптер». Бегать:
    go build main.go
  1. перейдите к GOPATH / src, узнайте относительный путь к основному пакету, здесь "myproject / adapter". Бегать:
    go build myproject/adapter

EXE-файл будет создан в каталоге, в котором вы сейчас находитесь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.