追記
最初に要件をなんとなく書いたけれど、ちゃんと考えてみれば、「記号を使わない(大文字小文字数字 しか使えない)」という過激な要件になるんじゃないかなーって思いました。
最初に考えてた要件に漏れがあったわけなので、再考したいです。(要件が厳しすぎて、できる気がしないけど。)
発端
package.json の scripts
フィールドに、「とりあえずなんか表示するだけの物を書きたい」ってことがあると思います。
しかし、JavaScript を使っているのだからクロスプラットフォーム対応するのは当然なので、以下のような要件があります。
- シェルコマンドっぽいものである
echo
を使わない -
シェルによって
'
や`
の挙動が違うため、使えない -
"
はエスケープすれば使えるけれど、可読性が下がるので NG
なので、package.json に以下のように書くことはできません
"scripts": {
"test": "echo nothing"
"start": "node -e \"console.log('not implemented')\""
},
考えたやり方
RegExp の toString()
を使う(ダメ)
"scripts": {
"test": "node -e console.log(/Hello/.toString())"
}
$npm t
> test@0.0.0 start /test
> node -e console.log(/Hello/.toString())
/Hello/
ダメな点
-
/
を使っている- ほんとに大丈夫か?って感じある。(たぶんダメ)
- 表示したい文字列に使える文字が、大小文字数字 のみ。
- 半角スペースが使えない
-
,
や.
も使えない(危なそうなので使いたくない) - 記号も使えない(危なそうなので使いたくない)
- 文字列の最初と最後に
/
が入る
echo-cli
を使う(たぶんダメ)
Windows 対応してない(テストしてないだけに見えますけどね。)
まとめ
良さげな方法がない。
結局、npm init
して作られる、 "test": "echo \"Error: no test specified\" && exit 1"
が最適解なのかなって思いました。(でもこれ、 )&&
使ってるから PowerShell だと動かないのでは…?
PowerShell でも動きました。(けど、やっぱり &&
とか \"
は使いたくないなーって思いますね)
PS C:\tmp> npm t
> tmp@1.0.0 test C:\tmp
> echo "Error: no test specified" && exit 1
"Error: no test specified"
npm ERR! Test failed. See above for more details.
PS C:\tmp> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.14409.1012
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14409.1012
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1