私が書いた同僚のコードを見て、彼女はrequireステートメントで@
シンボルを使用しています。これは、これらのファイルの1行目の最初の行です。
var restServer = require('@company/config')
このコードを実行しようとすると、エラーが発生します。
Error: Cannot find module '@company/config'
私が率直に期待していることは、私のディレクトリにはこれを認識する必要があるために見えるものは何もありません!ここでいくつかの魔法が起こっているように思えますが、それは嫌いです。
私が推測できるのは、これがいくつかのあいまいなnpmまたはNodeのトリックに触れたことがないか、または他の設定の暗い芸術が得られないことです。 @
がrequireでどのように機能するかの単なる説明であっても、どんな情報でも高く評価されています。
他のアイデア:シェフはこの全体のどこかに関与しているので、それは関連があるかもしれません。
更新:99%は、これがnpm config
がこの時点で機能する方法の問題であることを確信していますが、それを修正する方法はまだ不明です。
pdate2私が発見したいくつかのものに基づいて:
Dereks-MacBook-Pro:project-dir derekjanni$ npm config set //registry.npmjs.org/:authtoken $SECRET_TOKEN
Dereks-MacBook-Pro:project-dir derekjanni$ npm install
npm ERR! Darwin 15.0.0
npm ERR! argv "/usr/local/Cellar/node/5.5.0/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v5.5.0
npm ERR! npm v3.5.3
npm ERR! code E404
npm ERR! 404 Not found : @company/config
npm ERR! 404 '@company/config' is not in the npm registry.
だから私はこれを自分で解決しました。
@company/config
はプライベートNPMリポジトリの1つであり、npmでホストされ、このエイリアスによって内部GitHubリポジトリに定義されています。これはrequire
の動作とは関係ありません。
@
を使用することは、プライベートNPMリポジトリに関して私が知らなかったプロトコルである場合とそうでない場合があります。
Npmのスコープパッケージの前には「@」記号が付きます。 https://docs.npmjs.com/misc/scope
ドキュメントには、スコープパッケージの要求に関する追加情報が含まれています。 https://docs.npmjs.com/misc/scope#requiring-scoped-packages
スコープパッケージを要求する
スコープパッケージはスコープフォルダーにインストールされるため、コードでパッケージを要求する場合はスコープの名前を含める必要があります。
require('@myorg/mypackage')
Nodeがスコープフォルダーを処理する方法について特別なことはありません。これは、@ myorgというフォルダー内のモジュールmypackageを要求することを指定するだけです。
@
スコープはパッケージの所有権を示します
これまで見てきたスコープの主な利点は、GitHubのユーザー名/組織名のように、各スコープが組織/ユーザーのnpmアカウントによって制御されることです。
これにより、見ているパッケージが信頼できる組織のものであるか、サードパーティのツールであるかを簡単に判断できます。
たとえば、表示される場合:
@angular/cli
Angularチームからのものであり、信頼できることがわかっています。
一方、同じことは言うことができませんでした:
angular-cli
スコープパッケージとは別に、npmのmodule-aliasパッケージが原因で「@」が発生する可能性があります。モジュールのエイリアシングにより、パス全体を必要とせずに頻繁に使用されるモジュールを使用できます。また、ディレクトリ構造が長い場合にも効果的です。例)require('../../../../some/very/deep/module')
代わりに使用できます:var module = require('@deep/module')
Package.jsonでは、エイリアスを提供するモジュールを提供できます。
"_moduleAliases": {
"@root" : ".", // Application's root
"@deep" : "src/some/very/deep/directory/or/file",
"@my_module" : "lib/some-file.js",
"something" : "src/foo", // Or without @. Actually, it could be any string
}
そして、アプリのメインファイルでこれを使用します:
require('module-alias/register');
詳細については、こちらを参照してください: module-alias
require()
を呼び出すと、ルートを読み取ります。フォルダーに@company
という名前を付けても問題ないように思えるので、@
で何かを要求できるはずです。
構成は通常個人的なものであり、別のユーザーと同じにすることはできないため、同僚は@company/config.js
を自分で保持したいと思っているかもしれません。
require
は、プロジェクトフォルダー内のファイルを詳細とともに呼び出します。
./
を追加する必要があります。http
やnpm
モジュール(node_modules
にインストールされている)などのグローバルパッケージを呼び出す場合は、./
を省略できます。テストプロジェクトフォルダー内に@company/config
ルートを作成しました。 ./@company/config
を使用してのみ要求することができました。 node_modules
内でフォルダーを移動した場合にのみ、require('@company/config');
が許可されました。
node_modules
内にモジュールを配置することはお勧めしません。これはnpm
パッケージの単なる「コンテナー」です。新しい設定ファイルを作成して必要なルートを変更するか、単に必要なファイルを削除してメインファイルに設定オブジェクトを作成してみてください。