問題:
js2coffeは、単一ファイルの入出力リダイレクトでのみ機能します。プロジェクト全体とそのディレクトリ構造を変換するのは本当に面倒です。
ExpressJSのデフォルト アプリケーション プロジェクトを変換したい。それはディレクトリ構造ですか?
以下のスクリプトを確認してください
問題:
js2coffeは、単一ファイルの入出力リダイレクトでのみ機能します。プロジェクト全体とそのディレクトリ構造を変換するのは本当に面倒です。
ExpressJSのデフォルト アプリケーション プロジェクトを変換したい。それはディレクトリ構造ですか?
以下のスクリプトを確認してください
更新: お急ぎの場合は、以下のこのスクリプトの短いバージョンを確認してください。
簡単な Bash スクリプトがあなたのために仕事をします:
#!/bin/bash
for FILE in `find . -name "*.js" -type f -o -path './node_modules' -prune -o -path './components' -prune`
do
if [ -e $FILE ] ; then
COFFEE=${FILE//.js/.coffee}
echo "converting ${FILE} to ${COFFEE}"
js2coffee "$FILE" > "$COFFEE"
else
echo "File: {$1} does not exist!"
fi
done
all2coffee などのファイルを作成し、/usr/local/bin に配置chmod + x
し、ターミナルにフラグを追加します。
要件
js2coffee
まだインストールされていない場合は、グローバルにインストールされます。npm install -g js2coffee
スクリプトの説明
for ループ:
for FILE in `find arguments` ....
意味:
.js ファイルに出くわすFILE
たびに、find 出力が string に割り当てられますfind
パラメータを見つける:
-name "*.js"
末尾が .js のすべてのファイルを取得する
-type f
.js ディレクトリは必要なく、ファイルのみが必要なため、ファイルタイプである必要があります。
-o -path './node_modules' -prune
./node_modules
dir の追加でファイルを除外すること-prune
が重要です。そうしないと、 find は dir に降りて、ディレクトリで*.js
見つかったファイルを出力します
ブロックする:
if [ -e ${FILE} ] ; then
-eFILE
フラグは、文字列からの文字列がファイルシステムに既存のファイルであるかどうかをチェックし、そうでない場合else
は実行されます。
文字列操作:
COFFEE=${FILE//.js/.coffee}
bash 文字列操作によって.jsを.coffeeCOFFEE
に置き換える文字列を変数
に割り当てます。${STRING//match_this/replace_with}
変換:
js2coffee "$FILE" > "$COFFEE"
js2coffee に文字列FILE
と一緒にフィードCOFFEE
します
追加:
変換したすべての .coffee ファイルを新しいディレクトリに移動したいが、構造は維持したいですか?
cp はこのコマンドに必要なディレクトリを作成しないため、Linux またはOs Xではfindを使用します。ここで、仕事をするメインディレクトリで実行する小さなスクリプトrsync
ditto
すべての .coffee ファイルは /coffee dir にあり、.js ファイル階層をコピーします
for FILE in `find . -name "*.coffee"`
do
ditto .${FILE/./} coffee${FILE/./}
done
ファイルを .coffee に変換した後、これを実行します
アップデート
likeはサブディレクトリを作成しないため、最初の実行後にファイルを移動するためにditto
orrsync
をスワップできます。mv
mv
cp
更新 2
時間通りにワンライナーを追加しました。以下の2番目の回答を参照してください!
更新 3
./node_modules
依存関係を変換したくない人のために、ディレクトリを変換から除外するオプションを追加しました
短時間の方は、この気の利いたワンライナーを使用してください。
現在のディレクトリ ./ から開始し、サブディレクトリを通過してすべての.js
ファイルを.coffee
find . -type f -name '*.js' | while read f; do echo "grinding $f to ${f/.js/.coffee} "; js2coffee "$f" > "${f/.js/.coffee}"; done
ディレクトリを変換から除外 したいですか? ./node_modules
代わりに以下のものを使用してください。
find . -path ./node_modules -prune -o -type f -name '*.js' | while read f; do echo "grinding $f to ${f/.js/.coffee} "; js2coffee "$f" > "${f/.js/.coffee}"; done
ちょっとしたヒント:
このループは、ファイルの移動またはコピーにも使用できます。js2coffeeコマンドを、必要なものに置き換えてください。
find
出力 (見つかったファイルのリスト) は、簡単に変更およびフィルタリングできます。
bash では、上記の例のように、部分文字列の抽出 (または置換) は単純です。
重要 (長いバージョン) bash 変数は、変数名の前に$を追加することでアクセスできます。ただし、最初は$なしで定義されているため、メンタルヘルスのためにそのことを念頭に置いて、場合に備えて $var/var= 構文のコードを確認してください。あまり論理的でないエラーが表示されます。しばらくBashで何もしなかった後、私はこの間違いを何度も犯しているので、この単純な真実を共有するのが賢明だと思いました(お粗末な開発者である私もそうかもしれません)
重要 (短いバージョン)変数定義:var_name=value
変数アクセス: $var_name=value
、悪い考え: $var_name=value
、後で によってアクセスされ$var_name
ます。
例では、変数fは$fによってアクセスされ、$ {f }でアクセスされ ます。/.js
/.coffee
${f/.js/.coffee}
apple="green";
echo $apple;
出力:
green