>  기사  >  백엔드 개발  >  작업 공간과 함께 사용할 때 go build가 작동하지 않습니다

작업 공간과 함께 사용할 때 go build가 작동하지 않습니다

王林
王林앞으로
2024-02-08 21:06:181208검색

与工作区一起使用时 go build 不起作用

php 편집기 Banana는 작업 공간을 사용할 때 go build 명령이 제대로 작동하지 않는 일반적인 문제를 소개하기 위해 왔습니다. 이 문제는 개발자에게 혼란을 줄 수 있습니다. 작업 공간은 Go 언어에서 매우 중요한 개념이고, go build 명령을 제대로 사용하지 못하면 개발 프로세스에 심각한 영향을 미치기 때문입니다. 다음 글에서는 이 문제의 원인을 심층적으로 분석하고 개발자가 이 문제를 성공적으로 해결하는 데 도움이 되는 솔루션을 제공할 것입니다.

질문 내용

다음은 내 골랭 코드의 구조입니다.

으아악

문제는 단일 모듈에 대한 바이너리만 빌드할 수 있다는 것입니다. 다른 모듈을 빌드하려면 go.work에서 다른 모듈을 주석 처리한 경우에만 작동합니다

My go.work는 다음과 같습니다.

으아악

그래서 위의 go.work를 사용하여 다음과 같이 빌드하면 제대로 작동합니다.

go build -o test-binary -modfile ./moda/go.mod ./moda

하지만 아래와 같이 다른 모듈(예: modb/)을 빌드하려고 하면

go build -o test-binary1 -modfile ./go.mod ./modb

다음 오류가 발생했습니다.

으아악

go 工作 use를 사용해 보았으나 여전히 같은 문제에 직면했습니다. 누구든지 이 문제를 해결하도록 도와줄 수 있나요?

편집 1:

메인 모듈과 하위 모듈의 종속성을 분리하기 위해 여러 개의 go.mod 파일이 필요한 프로젝트가 있었고, 그때부터 내 사용 사례에 매우 적합한 Go 작업 공간에 대해 배우기 시작했습니다.

내 프로젝트 구조는 위에서 언급한 것과 동일합니다.

으아악

이제 하위 모듈에 대한 실행 파일을 빌드할 때 go build가 제대로 작동하지만 기본 모듈에 대한 실행 파일을 빌드할 때 하위 모듈/go.mod에 있는 가져오기도 기본 모듈 실행 파일에 추가됩니다. go build -n로도 확인했습니다.

주 모듈 실행 파일에 하위 모듈 가져오기를 추가하는 것을 피하기 위해 -modfile를 사용했지만 이를 사용하면 주 모듈이 아닌 하위 모듈에 대한 실행 파일만 빌드할 수 있습니다.

github 소스 코드

ps: github에 샘플 코드를 추가했지만 동일한 문제가 재현되지 않습니다. (서브 모듈 가져오기가 메인 모듈에 추가됨) 사용한 가져오기 때문인지는 잘 모르겠습니다


정답


After @arigatomanga와 논의한 결과 작업 공간의 최소 버전 선택(mvs)으로 인해 혼란이 발생한다는 사실을 알게 되었습니다. 작업공간은 최소 버전 선택(mvs)(Reference)을 실행할 때 기본 모듈로 사용되는 디스크의 모듈 모음입니다. mvs 덕분에 작업 공간 모드가 활성화된 상태로 빌드된 모듈은 작업 공간 모드가 비활성화된 상태로 빌드된 모듈과 다른 종속 모듈을 사용할 수 있습니다.

이것은 작업 공간의 문서화된 동작이며 현재 문제가 없습니다.

업데이트: 아래는 -modfile 플래그에 초점을 맞춘 원래 답변입니다. go1.21의 작업공간 모드에서는 이 플래그가 거부됩니다.

go 도구에서 오류가 발생했습니다. 방금 이 문제를 여기에 보고했습니다.

go1.20의 오류 메시지는 다르며 여전히 오해의 소지가 있습니다.

으아악

차이점은 커밋에 의해 발생했습니다. cmd/go/internal/modload: go.work에서 모듈 간에 모듈 경로가 중복되면 오류가 반환되었지만 근본 원인은 동일합니다. 작업 공간 모드에서는 -modfile 플래그가 수정되지 않았습니다. .

업데이트: 다음 섹션은 현재 관련이 없습니다. mvc가 무엇인지 이해하기 전에 -modfile 플래그를 사용하여 mvs를 억제하려는 시도는 실패한 시도입니다.

이슈 리포트에서 작업 공간 모드에서 -modfile 플래그를 차단할 것을 제안했습니다. 하지만 당신은 댓글에서 이 플래그가 필요하다고 말했습니다.

-modfile 的原因是如果我为 ./src 构建二进制文件,即使在 ./moda 中存在的模块也会作为 ./src을 사용하는 이유는 ./src에 대한 바이너리를 빌드하면 ./moda에 있는 모듈도 ./src code>는 바이너리의 일부로 다운로드 및 로드되지만 포함되어서는 안 됩니다

그러나 cmd/go 문서에 따르면 :

-modfile 파일

모듈 인식 모드에서 대체 go.mod를 읽고 쓸 수 있습니다. 모듈 루트 디렉터리의 파일 대신 파일. 이름이 사람 모듈 루트를 확인하려면 "go.mod"가 여전히 존재해야 합니다. 디렉터리에 액세스했지만 디렉터리에 액세스하지 못했습니다. -modfile이 지정되면, 또한 대체 go.sum 파일을 사용합니다. 해당 경로는 다음에서 파생됩니다. -modfile 플래그, ".mod" 확장자를 자르고 ".sum"을 추가합니다.

-modfile 标志用于替换模块根目录中的 go.mod 플래그는 모듈 루트 디렉터리의 go.mod 파일을 대체하는 데 사용됩니다. 그러나 귀하의 예에서는 모듈 루트에 있는 파일과 동일한 파일을 지정했습니다. 그래서 저는 잘 이해가 되지 않습니다. 이 부분을 자세히 설명하기 위해 질문을 업데이트할 수 있습니까? 데모가 진행 중입니다!

위 내용은 작업 공간과 함께 사용할 때 go build가 작동하지 않습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제