<!-- 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"