Код Visual Studio с GO — несколько основных объявлений (настройки запуска)

Я новичок в коде VS и Golang.
У меня есть существующий проект, содержащий 2 разных сервиса — давайте назовем один A, а второй B.
Оба A и B находятся в одном каталоге.

Всякий раз, когда я пытаюсь запустить A или B, я получаю следующую ошибку:

# directory/directory/directory/A&B_Directory
./A.go:12:6: main redeclared in this block
    previous declaration at ./B.go:18:6

Я попытался поиграть с файлом launch.json, добавив следующие разделы:

   {
        "name": "Launch Program",
        "type": "go",
        "request": "launch",
        "mode": "debug",
        "program": "FullDirectory/A.go"
    }

Также пытался в атрибуте программы установить значение ${file} и многие другие варианты, которые не увенчались успехом.

Я хотел бы получить какое-то направление, я немного потерялся. Спасибо.


person DotnetProg    schedule 30.08.2017    source источник
comment
Вы не можете иметь более одного main в одной программе. Все файлы в каталоге являются частью одного пакета. Если вы хотите, чтобы A и B были отдельными сервисами, они должны находиться в разных каталогах.   -  person Flimzy    schedule 30.08.2017
comment
Это не одна программа, это 2 разные программы, находящиеся в одном каталоге. В Goland вы можете иметь профили конфигурации для каждой службы.   -  person DotnetProg    schedule 30.08.2017
comment
Тогда как это работает с Голандом?   -  person DotnetProg    schedule 30.08.2017
comment
Это не так. Я уверяю вас.   -  person Flimzy    schedule 30.08.2017
comment
Один каталог, один пакет. Никогда больше. Так просто. Нет причин спорить здесь.   -  person Volker    schedule 30.08.2017
comment
Хорошо, говоря такие вещи, это не помогает. В Goland у вас есть возможность выбрать, какой файл запускать. Я почти уверен, что это можно выбрать и в коде VS.   -  person DotnetProg    schedule 30.08.2017
comment
У меня есть код Goland и VS на машине - и он работает с goland. С этим не поспоришь.   -  person DotnetProg    schedule 30.08.2017
comment
@DotnetProg У меня смутное ощущение, что вы можете быть укушены из-за привычки использовать go run file1 [file2 [...]] для компиляции и запуска раундов вне vscode. Проблема в том, что это ухудшенный случай, который обычно не используется для реальных проектов Go. При работе над проектом обычным способом вы обычно выполняете go install [package_spec], который либо использует весь текущий каталог, либо просматривает их дерево, указанное package_spec, собирает и устанавливает там все, что не является актуальным. . Это не будет работать с двумя файлами в одном и том же каталоге, содержащими main() в пакете main.   -  person kostix    schedule 30.08.2017
comment
@DotnetProg, … так что вполне может быть так, что когда вы нажимаете на то, что означает запуск в vscode, он действительно пытается сделать что-то похожее на go install и терпит неудачу.   -  person kostix    schedule 30.08.2017
comment
VSCode делает go build, а затем запускает исполняемый файл, что должна делать IDE. Gogland, вероятно, использует go run, что является ужасной практикой, и ее следует избегать - одна из причин заключается в том, что она маскирует именно такие проблемы, когда у вас есть недопустимый пакет с несколькими объявлениями main в одном пакете.   -  person Adrian    schedule 30.08.2017
comment
@DotnetProg JFTR вы можете найти эти два короткие сообщения, представляющие интерес поскольку они в основном служат кратким введением в то, что инструмент go может делать с кодом Go.   -  person kostix    schedule 31.08.2017
comment
@kostix и Адриан Большое спасибо за всю информацию и людям, которые пытались помочь. Я посмотрю на это позже сегодня. А пока я решил больше не тратить время на код VS, я пока пойду с Gogland, а когда у меня будет больше времени (и опыта работы с go), я попытаюсь заставить мой проект работать с VS код.   -  person DotnetProg    schedule 31.08.2017


Ответы (1)


Отказ от ответственности: это не рекомендуемый подход, я согласен с другими, вы должны разделить службу A и B в разных каталогах.

Ответ на ваш вопрос: Чтобы запустить конкретный файл, используйте следующую конфигурацию для эмуляции go run current-file:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Run current file",
            "type": "go",
            "request": "launch",
            "mode": "exec",
            "program": "full-path-to-go.exe",
            "args": ["run", "${file}"],
            "showLog": true
        }
    ]
}

Режим exec предназначен для запуска предварительно собранного бинарника, указанного в свойстве program (необходимо указать полный путь к бинарнику go). Затем в качестве аргументов просто добавьте run и имя файла (${file}) к свойству args.

person putu    schedule 30.08.2017
comment
Большое спасибо, пытался заставить эту конфигурацию работать, но безуспешно. А пока - я просто пойду с Гогландом и более тщательно изучу ваш ответ, когда у меня будет больше опыта работы с Go. - person DotnetProg; 31.08.2017
comment
@DotnetProg, в чем ошибка? Я пробовал, и это работает. Вы должны открыть и просмотреть файл, который хотите запустить. - person putu; 31.08.2017