ホームページ >バックエンド開発 >Golang >Go を使用した初めての CLI

Go を使用した初めての CLI

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-09-25 22:08:221100ブラウズ

My first CLI with Go

私は自分の経験について書くことにいつも少し不安を感じていました。まあ、今なら対処できると思います。数日前に基本を学んだので、Go を「練習」するために CLI ツールを作成することにしたのは、8 月の早朝のことでした。最近はチュートリアルをあまり見ませんが、Golang で Nana のビデオを見ましたが、とても素晴らしかったです。それでは、早速始めましょう。

理由

OS モジュールを学ぶために Go を試してみたかったのです。最初に頭に浮かんだのは、サーバーとして Golang を使用してターボレポを作成することでした。はい、Vercel でホストできないことはわかっていますが、Golang を使用して高速で安全なサーバーを作成するという考えがありました。 Vercel で API プロキシを使用して、クライアント側からのリクエストを書き換えることができます。ただし、Railway や Render などのいくつかの場所で Go サーバーを個別にホストする必要があります。これはモノ リポジトリ アーキテクチャの規則に従っておらず、すべてのコードを 1 か所に維持し、強力なサーバーを構築しているだけです。 turbo-g(ターボ+ゴー)と名付けられました。

テンプレート プロジェクトを作成した後、Turbo にはホット リロードやその他多くの問題があることに気付きました。それで、最終的にはそのアイデアを放棄し、別のものを作成することに移りました。

このテンプレート プロジェクトを作成するとき、サーバーを手動でセットアップする必要があることがわかり、Express のような機能を備えた gofiber を使用しました。MERN スタック開発者として、非常に使いやすいことがわかりました。一度、Express でもサーバー プロジェクト ジェネレーターを作成しようと考えましたが、Express ジェネレーターと呼ばれるサーバー プロジェクト ジェネレーターはすでに存在します。それから、ファイバーにも同じようなことがあるかもしれないと思いました。しかし、トピック:go-backend-template を使用して GitHub を検索したとき、クローンを作成してプロジェクトに使用できる既製のテンプレートしか見つかりませんでした。そのとき、私は試してみることにしました。

プロセス

go コードはバイナリ実行可能ファイルにコンパイルされるため、go で CLI を作成するのは非常に簡単です。しかし、os モジュール を使用してファイルやフォルダーを作成する方法がわかりませんでした。 JavaScript(NodeJs)では、fsモジュールを使用してファイルを管理できます。助けてくれたドキュメントに感謝します。 Express と Fiber における基本的なバックエンド プロジェクトがどのようなものであるかはすでに知っていました。私のアプローチはとてもシンプルでした。プロジェクト名に --init や --name などのいくつかのフラグを使用する CLI ツールを作成します。このツールは、依存関係として Fiber を含むプロジェクトと go.mod を生成します。

その後、テンプレートと呼ばれるものにはまってしまいました。 テンプレートは go ファイルのスケルトンです。テンプレートはファイルのコンテンツを保持します。テンプレートについて学ぶのは面白かったです。次に、フラグからプロジェクト名を取得し、os.MkdirAlland を使用してすべてのファイル フォルダーを作成し、text/template モジュールでテンプレートを解析し、ファイルを作成するためのコンテンツを取得するのは簡単でした。これらのモジュールの詳細はすべて、上で説明した 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 フラグを追加しました。

  • まだ存在するもう 1 つの問題は、ミドルウェア テンプレート ファイルと構成テンプレート ファイルにコードを提供していないことです。ユーザーは MongoDB または PostgreSQL をデータベースとして使用できるため、テンプレートに単一または両方の構成を指定する必要はありませんでした。これを解決するために、問題を作成しました。このブログを読んでいる人は誰でも、この問題の解決に貢献できます。私はすでに方法を考え出しましたが、これは 3 番目の問題になります。

  • CLI は、-db というユーザー入力を使用して、MongoDB や PostgreSQL などのユーザーが選択したデータベースを取得し、Config テンプレートでダミー接続を作成できます。しかし、この種の問題を解決するためにコードが大きくなると、CLI は使用できなくなります。これにはすでに 2 つの必須フラグと、--init、-gh、および -name というオプションの 1 つがあり、-db フラグを追加すると、非常に長いコマンドになります。この問題を解決するために、CLI を create-next-app のような対話型のものに変更します。この変更後、カスタマイズのための多くのオプションを追加できます。私はすでにこれに取り組んでいます。したがって、貢献したい場合は、大歓迎です。問題はここで見つけることができます。

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

結束

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

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

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

再次感謝。

以上がGo を使用した初めての CLIの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。