clojureで作ったツールを作るためのツール

目次

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
Last-modified: 2025-02-09 (日) 20:33:35 (36d)