Typescript Mono-repoプロジェクトのリンターとして機能するCIビルドで使用できるスクリプトを構成しようとしています。
.js
私が達成したいのは、プロジェクト/パッケージリポジトリにファイルがあることを確認することです。ただし、node_modules
そのファイルがあるフォルダとcommon
フォルダ、およびすべてのサブディレクトリとファイルは避けることです。
ファイル構造はこれです
project/
├── apps/
│ ├── app1
├── common/
│ ├── folder1
│ ├── folder1
│ ├── etc
├── lib/
│ ├── lib1
├── services/
│ ├── service1
services,lib,apps
すべてのnpmプロジェクトのサブディレクトリです。
これまでに試したさまざまな試みのいくつかは次のとおりです。
find . \( ! -name node_modules \) -o \( ! -path common -prune \) -name "*.js" -print
しかし、他のホワイトリストフォルダにダミーファイルを作成しても.js
何も返さないようです。/project
これはテストファイルを印刷するため、最も近いようですが、ファイルも見つかりましたが、common
ブラックリストに追加する必要があります。
find . -type d \( -path common -o -name node_modules \) -prune -false -o -name '*.js'
この実行の出力:
./test.js
./common/temp/pnpmfile.js
./common/temp/pnpm-store/2/registry.npmjs.org/ipaddr.js
./common/config/rush/pnpmfile.js
./common/scripts/install-run.js
./common/scripts/install-run-rushx.js
./common/scripts/install-run-rush.js
./services/test.js
このスクリプトで私が望む全体的な目標は、ファイルがホワイトリストディレクトリにない場合は0を終了し、ファイルが.js
ブラックリストディレクトリの外にある場合は1を終了することです。.js
私は初心者であり、シェルコマンドの経験がないので、助けてくれてありがとう。よろしくお願いします!
答え1
あなたの注文はほぼ正確です。編集してください:
find . \( -name node_modules -o -path ./common \) -prune -o -name '*.js' -print
これにより、名前が付けられてnode_modules
いるか、内のすべての項目が切り捨てられます./common
。使用されるパス名は-path
最上位の検索パスで始まる名前なので、.
この場合はで始まる必要があります。
あなたが-false
使用することは必須ではありません。node_modules
それ以降のテストと./common
一致する場合は必須です。この場合でも使用したいかもしれませんが、今は必要ありません。-name
-o
-type d
テスト:
$ tree
.
|-- common
| `-- file.js
|-- dir
| |-- common
| | `-- file.js
| |-- file.js
| `-- node_modules
| `-- file.js
`-- node_modules
`-- file.js
5 directories, 5 files
$ find . \( -name node_modules -o -path ./common \) -prune -o -name '*.js' -print
./dir/file.js
./dir/common/file.js
ファイルがクリーン./dir/common/file.js
アップされていないディレクトリにあるために見つかりました(common
現在のディレクトリのすぐ下にある場合にのみクリーンアップされます)。
他の場所で、あなたはそれがあるかどうかを確認したいようですどの*.js
ディレクトリ内の一致するファイルはクリーンアップされません。次のようにすると、効果的にこれを行うことができます。
if find . \( -name node_modules -o -path ./common \) -prune -o -name '*.js' -exec echo . \; | grep -q .
then
echo there are JS files
else
echo there are no JS files
fi
ここでは、ファイルが見つかるたびにドット(どんな文字でも可能)を出力し、それをgrep -q .
検出に使用しますfind
。何かが見つかると、grep
「成功」を意味するゼロ終了状態で終了し、文はif
最初のエントリを使用します。小枝。コマンドは、もはや受信していないパイプに別のポイントを書き込もうfind
とするとすぐに終了します。grep
答え2
-pathを使用している場合は、見つかったツリーのどの場所と一致するか./common
など、完全に宣言されたパスを使用してください。-name
この命令は私にとってテストです。
find . -type d \( -name common -o -name node_modules \) -prune -false -o -name '*.js'
答え3
上記の答えのいくつかを見てテストした後、最後に使用したコマンドは次のとおりです。
find . \( -name node_modules -o -path ./common \) -prune -o -name '*.js' -print
引数を保持しなければならなかった理由-print
は、それを実行したときに得られた出力が、いくつかのフォルダを-print
次の出力として表示しないことがわかったためです。
./common
./lib/trader-sdk/node_modules
./lib/is-ticker-symbol/node_modules
./apps/cron-app/node_modules
./services/templating-service/node_modules
./services/api-service/node_modules
./services/trading-services/node_modules
./services/sentiment-service/node_modules
しかし、argを追加すると、-print
出力は何もなりません。これはこの場合の期待される結果です。
.js
ボーナス:最後のユースケースは次のとおりです。 TypeScriptモノリポジトリを調べて、ビルドファイルをマスターにマージしたい人がいないことを確認するデフォルトのスクリプト。
#!/bin/bash
jsFiles=$(find . \( -name node_modules -o -path ./common \) -prune -o -name '*.js' -print)
if [ -z "$jsFiles" ]
then
echo "No JS files found, free to proceed"
exit 0
else
echo "JS files found, unable to proceed"
exit 1
fi