<!-- markdown -->

# clojureで作ったツールを作るためのツール
# 目次
[TOC]

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

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

    (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を用意する

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

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

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
    }
# 前提
スクリプトを実行する前にLeiningenがインストールされている必要があります

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

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

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

git bashで、文字化けの修正がうまくいったコマンド。git bash上から、いったんpowershellを呼ぶという方法です。
    powershell -command "chcp 65001"

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   最終更新のRSS