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 중국어 웹사이트의 기타 관련 기사를 참조하세요!