* clojureで作ったツールを作るためのツール [#o0d1256e]
* 目次 [#b443430f]
#contents

* project.clj について [#e7d1b819]
project.cljは、Clojureプロジェクトの依存関係や設定を管理するためのプロジェクトファイルです。Maven(pom.xml)に相当するものです。

** project.cljの基本構造 [#oa5db063]
基本的な構造は以下のようになります:

 (defproject プロジェクト名 "バージョン"
   :description "プロジェクトの説明"
   :dependencies [[org.clojure/clojure "バージョン"]]
   :main メイン名前空間)

例:
 (defproject xxx "0.1.0-SNAPSHOT"
  :description "説明"
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :main xxx.xxx)

* project.cljを用意する [#oe8efa41]

** プロジェクトの生成は以下のコマンドを使うのが基本 [#leb8e6b5]
 lein new app fileserver
README.mdファイルや、.gitignoreファイルやtestディレクトリなどを作ってくれる

** clojureプロジェクト作成ツールを作ってみる [#xc945e56]
上記のことを知らずに、作ってしまった記事が以下である。学習順序を間違えたか。。。


書き方が決まっている感じがするが、なぜかAIで生成する際にいつも、同じことでつまづいているの(何度かトライアンドエラーして自己解決はしてくれるが、またか!ってなる)で、コード生成させる。テキストコードを生成できればいいので、なんでもいいがbashのスクリプトとかで作ってみることにする。
clojureの実行するための書き方が決まっている感じがするが、なぜかAIで生成する際にいつも、同じことでつまづいているの(何度かトライアンドエラーして自己解決はしてくれるが、またか!ってなる)で、コード生成させる。テキストコードを生成できればいいので、なんでもいいがbashのスクリプトとかで作ってみることにする。

 #!/bin/bash
 
 # 使用方法を表示する関数
 function show_usage() {
     echo "使用方法: new_clj <名前空間> <ファイル名> <プロジェクトの説明>"
     echo ""
     echo "引数:"
     echo "  名前空間          - Clojureの名前空間"
     echo "  ファイル名        - 作成するClojureファイルの名前"
     echo "  プロジェクトの説明 - プロジェクトの説明文"
     echo ""
     echo "例:"
     echo "  new_clj myapp core \"My First Clojure App\""
 }
 
 # Clojureプロジェクトを新規作成する関数
 # 引数:
 #   $1: 名前空間
 #   $2: clojureのコードを書くファイル名
 #   $3: プロジェクトの説明
 function new_clj() {
     # 引数の数をチェック
     if [ $# -ne 3 ]; then
         echo "エラー: 引数の数が不正です。3つの引数が必要です。"
         echo ""
         show_usage
         return 1
     fi
     
     # 引数の取得
     namespace=$1
     filename=$2
     summary=$3
     
     # 引数の妥当性チェック
     if [ -z "$namespace" ] || [ -z "$filename" ] || [ -z "$summary" ]; then
         echo "エラー: 空の引数は指定できません。"
         echo ""
         show_usage
         return 1
     fi
     
     # ファイル・ディレクトリ設定
     ext="clj"
     src_dir="$namespace/src/$namespace"
     pathname="$src_dir/$filename.$ext"
     filepath=${filename//-/_}  # ハイフンをアンダースコアに置換
     projectFile="$namespace/project.clj"
 
     # ディレクトリ構造の作成
     if ! mkdir -p "$src_dir"; then
         echo "エラー: ディレクトリの作成に失敗しました。"
         return 1
     fi
 
     # project.clj の生成
     if [ ! -f "$projectFile" ]; then
         cat << EOF > "$projectFile"
 (defproject $namespace "0.1.0-SNAPSHOT"
   :description "$summary"
   :dependencies [[org.clojure/clojure "1.11.1"]]
   :main $namespace.$filepath)
 EOF
     else
         echo "警告: project.clj は既に存在します。スキップします。"
     fi
 
     # Clojureソースファイルの生成
     if [ ! -f "$pathname" ]; then
         cat << EOF > "$pathname"
 (ns $namespace.$filepath
   (:gen-class))
 
 (defn sample-command1
   "サンプルコマンド1の実装"
   [args]
   (println "sample-command1が実行されました")
   (println "引数:" args))
 
 (defn sample-command2
   "サンプルコマンド2の実装"
   [args]
   (println "sample-command2が実行されました")
   (println "引数:" args))
 
 (defn usage
   "使用方法を表示"
   []
   (println "使用方法: lein run <command> [args...]")
   (println "")
   (println "利用可能なコマンド:")
   (println "  sample-command1  - サンプルコマンド1の説明")
   (println "  sample-command2  - サンプルコマンド2の説明"))
 
 (defn -main
   "アプリケーションのエントリーポイント"
   [& args]
   (if (empty? args)
     (usage)
     (let [command (first args)
           command-args (rest args)]
       (case command
         "sample-command1" (sample-command1 command-args)
         "sample-command2" (sample-command2 command-args)
         (do
           (println "エラー: 不明なコマンドです:" command)
           (println "")
           (usage))))))
 EOF
         echo "Clojureソースファイルを生成しました: $pathname"
     else
         echo "警告: Clojureソースファイル ($pathname) は既に存在します。スキップします。"
     fi
 
 # セットアップ手順の表示
 cat << EOF
 プロジェクトの作成が完了しました!
 
 # セットアップ手順
  0. Git Bashで日本語を使用する場合
     powershell -command "chcp 65001"
 
  1. Javaのセットアップ
     set JAVA_HOME=C:\\Program Files\\Java\\jdk-17
 
  2. プロジェクトディレクトリへ移動
     cd $namespace
 
  3. 依存関係の解決(初回のみ)
     lein.bat deps
 
  4. プロジェクトの実行
     lein.bat run
 
 EOF
     
     return 0
 }
* 前提 [#ze4305e1]
スクリプトを実行する前にLeiningenがインストールされている必要があります

lein.batがあるディレクトリを環境変数のPATHに加える必要があります。

* 注意 [#s8620e62]
windows11で動作確認したやり方です。macの場合は .batという書き方市内と思います。

clojureでwindowsのgit bashを使う場合。UTF-8を使う場合は以下を1度実行する必要があった。ネットで紹介されている方法やAIに提案された方法を6,7個ほどいろいろためしたが、これ以外は文字化けが直らなかった。

git bashで、文字化けの修正がうまくいったコマンド。git bash上から、いったんpowershellを呼ぶという方法です。
 powershell -command "chcp 65001"
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS