7

問題:

js2coffeは、単一ファイルの入出力リダイレクトでのみ機能します。プロジェクト全体とそのディレクトリ構造を変換するのは本当に面倒です。

ExpressJSのデフォルト アプリケーション プロジェクトを変換したい。それはディレクトリ構造ですか?

以下のスクリプトを確認してください

4

2 に答える 2

23

更新: お急ぎの場合は、以下のこのスクリプトの短いバージョンを確認してください。

簡単な 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_modulesdir の追加でファイルを除外すること-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を使用します。ここで、仕事をするメインディレクトリで実行する小さなスクリプトrsyncditto

すべての .coffee ファイルは /coffee dir にあり、.js ファイル階層をコピーします

for FILE in `find . -name "*.coffee"`
do 
    ditto .${FILE/./} coffee${FILE/./}    
done

ファイルを .coffee に変換した後、これを実行します

アップデート

likeはサブディレクトリを作成しないため、最初の実行後にファイルを移動するためにdittoorrsyncをスワップできます。mvmvcp

更新 2

時間通りにワンライナーを追加しました。以下の2番目の回答を参照してください!

更新 3

./node_modules依存関係を変換したくない人のために、ディレクトリを変換から除外するオプションを追加しました

于 2012-12-30T15:10:31.187 に答える
9

短時間の方は、この気の利いたワンライナーを使用してください。 現在のディレクトリ ./ から開始し、サブディレクトリを通過してすべての.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

于 2014-01-30T23:31:58.123 に答える