>  기사  >  백엔드 개발  >  Go를 사용한 첫 번째 CLI

Go를 사용한 첫 번째 CLI

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-09-25 22:08:221037검색

My first CLI with Go

저는 항상 제 경험을 글로 쓰고 싶은 마음이 좀 있었어요. 글쎄요, 이제 처리할 수 있을 것 같아요. 며칠 전에 배운 기본을 그대로 "연습"하기 위해 CLI 도구를 작성하기로 결정한 것은 8월의 이른 아침이었습니다. 요즘 튜토리얼을 많이 보지 않지만 Golang에서 Nana의 비디오를 봤는데 꽤 굉장했습니다. 그럼 바로 들어가보겠습니다.

이유

OS 모듈을 배우기 위해 Go를 실험해보고 싶었습니다. 가장 먼저 떠오른 생각은 Golang을 서버로 사용하여 터보레포를 만드는 것이었습니다. 예, Vercel에서 호스팅할 수 없다는 것을 알고 있지만 Golang을 사용하여 빠르고 안전한 서버를 만드는 것이 아이디어였습니다. Vercel에서 API 프록시를 사용하여 클라이언트 측의 요청을 다시 작성할 수 있습니다. 그러나 Railway 또는 Render와 같은 일부 장소에서는 Go 서버를 별도로 호스팅해야 합니다. 이는 모노 레포 아키텍처의 규칙을 따르지 않고 모든 코드를 한 곳에 유지하고 강력한 서버를 구축하는 것입니다. turbo-g(터보 + 고)라는 이름이 붙었습니다.

음, 템플릿 프로젝트를 생성한 후 Turbo에 핫 리로드 및 기타 여러 가지 문제가 있다는 것을 깨달았습니다. 그래서 결국 아이디어를 버리고 다른 것을 만들기 시작했습니다.

이 템플릿 프로젝트를 만들 때 서버를 수동으로 설정해야 한다는 점을 알고 Express와 같은 기능이 있는 GoFiber를 사용했는데 MERN 스택 개발자로서 사용하기가 매우 쉽다는 것을 알았습니다. 예전에 Express에서도 서버 프로젝트 생성기를 만들려고 했는데 이미 가지고 있어서 express-generator라고 합니다. 그러다가 Fiber에도 같은 것이 있을 수 있다고 생각했습니다. 하지만 GitHub에서 go-backend-template 주제로 검색했을 때 복제하여 프로젝트에 사용할 수 있는 미리 만들어진 템플릿만 찾았습니다. 그때 한번 시도해 보기로 결정했습니다.

과정

go 코드가 바이너리 실행 파일로 컴파일되므로 go를 사용하여 CLI를 만드는 것은 매우 간단합니다. 그런데 os 모듈을 이용해 파일과 폴더를 만드는 방법을 몰랐습니다. JavaScript(NodeJs)에서는 fs 모듈을 사용하여 파일을 관리할 수 있습니다. 나를 도와준 문서에 감사드립니다. 나는 Express와 Fiber의 기본 백엔드 프로젝트가 어떤 것인지 이미 알고 있었습니다. 내 접근 방식은 매우 간단했습니다. 프로젝트 이름에 --init 및 --name과 같은 몇 가지 플래그를 사용하는 CLI 도구를 생성하고 Fiber를 종속성으로 사용하여 프로젝트와 go.mod를 생성합니다.

그러다 템플릿이라는 것에 갇혔어요. 템플릿은 Go 파일의 뼈대입니다. 템플릿은 파일의 내용을 담고 있습니다. 템플릿에 대해 배우는 것은 흥미로웠습니다. 그런 다음 플래그에서 프로젝트 이름을 가져오고 os.MkdirAlland를 사용하여 텍스트/템플릿 모듈로 템플릿을 구문 분석하고 콘텐츠를 가져와 파일을 생성하는 모든 파일 폴더를 만드는 것이 쉬웠습니다. 이 모듈의 모든 세부 사항은 위에서 언급한 Golang 문서에서 찾을 수 있습니다. 그러면 끝났습니다! ? 그런데..

dirs := []string{"cmd", "internal/handlers", "internal/middleware", "internal/models", "internal/routes", "internal/services", "config"}
    for _, dir := range dirs {
        if err := os.MkdirAll(filepath.Join(projectPath, dir), os.ModePerm); err != nil {
            return fmt.Errorf("❗Failed to create directory %s: %w", dir, err)
        }
    }

문제

  • 내가 github.com//를 사용하지 않는다는 사실을 곧 알게 되었습니다. 제가 처음 go 모듈을 배울 때 겪었던 문제였던 모듈 이름입니다. 그러다가 여기에서 모듈 경로에 대해 알게 되었습니다. 그래서 문제를 해결하기 위해 제가 한 일은 매우 간단합니다. 사용자가 GitHub 사용자 이름을 추가하여 프로젝트 이름이 GitHub 저장소라고 가정하고 모듈을 만들 수 있도록 -gh 플래그를 추가했습니다.

  • 또 다른 문제는 미들웨어 템플릿 파일과 config 템플릿 파일에 코드를 제공하지 않았다는 점입니다. 사용자는 MongoDB 또는 PostgreSQL을 데이터베이스로 사용할 수 있으므로 템플릿에 단일 구성 또는 두 구성을 모두 제공할 필요가 없습니다. 글쎄, 이 문제를 해결하기 위해 저는 문제를 만들었고 이 블로그를 읽는 사람은 누구나 이 문제를 해결하는 데 기여할 수 있습니다. 이미 방법을 알아냈는데 이것이 세 번째 문제로 귀결됩니다.

  • CLI는 -db라는 사용자 입력을 받아 MongoDB 또는 PostgreSQL과 같은 데이터베이스를 사용자가 선택하도록 하고 Config 템플릿에서 더미 연결을 만들 수 있습니다. 하지만 이런 종류의 문제를 해결하기 위해 코드가 늘어나면 CLI를 사용할 수 없게 됩니다. 이미 2개의 필수 플래그와 --init, -gh 및 -name이라는 하나의 선택 플래그가 있으며, -db 플래그를 추가하면 매우 긴 명령이 됩니다. 이 문제를 해결하기 위해 CLI를 create-next-app과 같은 대화형 CLI로 수정하겠습니다. 이 변경 후에는 사용자 정의를 위한 다양한 옵션을 추가할 수 있습니다. 나는 이미 이 일을 하고 있습니다. 따라서 기여하고 싶다면 환영합니다. 여기서 문제를 찾을 수 있습니다.

  • 現在的最後一個問題是熱重載模組。每當我們建立 Fiber 應用程式時,預設情況下我們沒有任何更改偵聽器。如果纖維已經有這個,而我不知道,那麼請原諒我,因為我對此還比較陌生。如果您對此有任何了解,請在評論中告訴我。為了解決這個問題,我想出了在專案中包含空氣

結束

這是光學的故事。然而,該部落格的目的是讓大家了解這個小項目,如果您願意的話,它也是一個為該項目做出貢獻的邀請。

旅程才剛開始,到目前為止還很有趣。我學到了很多東西,並且願意在未來學習更多。這是我在這裡的第一篇博客,所以如果我犯了任何錯誤或忽略了某些內容,請忽略並原諒我。下次會更好。

謝謝大家閱讀博客,如果您覺得有趣,請給光學一個⭐。另外,如果您知道有人願意貢獻,請分享。另外,如果您發現任何問題或有任何改進的想法,您可以在這裡建立問題

再次感謝。

위 내용은 Go를 사용한 첫 번째 CLI의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.