フォークされたgithubリポジトリのnpmインストールとビルド


125

これはまったく新しい質問ではありませんが、今しばらく探し回っていましたが、解決策を見つけるのに苦労しています。

私はangular-translateと呼ばれる私の角度のアプリのためのモジュールを使用しています。ただし、すべてを希望どおりに機能させるには、ソースコードにいくつかの小さな変更を加える必要がありました。次に、それらの変更をに保持したいと思いnpm installます。同僚から、ソースコードのレポをフォークして、フォークしたレポを依存関係として指定するよう提案されました。

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz

最初のものは、ビルドのないこのようなディレクトリを私に与えます。package.json、.npmignore、およびいくつかのマークダウンファイルのみ

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc

2番目npm installは完全なレポを提供しますが、コマンドを使用するときのようにビルドを取得できませんnpm install angular-translate。プレパブリッシュスクリプトの実行について少し説明しましたが、すべてのモジュールをインストールするときにこれを行う方法がわかりません。また、フォークを自分のモジュールとしてnpmレジストリに公開しようとしましたが、やはりビルドが取得されず、それが正しいことかわかりません...

そのトピックについての無知をお詫び申し上げます。私はnpmの経験があまりありません。この問題についてのフィードバックをお待ちしています。パッケージのソースコードに変更を加える必要がある場合、それは一般的な十分な問題であると思われますか?多分もっと良い解決策がありますか?よろしくお願いします。

回答:


139

を試してくださいnpm install <ghusername>/<repoName><ghUsername>は、GitHubのユーザー名(なし@)で、<repoName>はリポジトリの名前です。これで正しくインストールされます。おそらく、依存関係をに保存するには、installコマンドで--saveor --save-devフラグを使用しますpackage.json

それが正しく機能しない場合は、.npmignoreファイルの内容を確認してください。

installコマンドに長い時間がかかっても慌てないでください。gitリポジトリからのインストールは、npmレジストリからのインストールよりも時間がかかります。


編集:

あなたの問題は、あなたの場合、dist/リポジトリにコミットされていないことです(それがにあるため.gitignore)。これが実際のコードが存在する場所です。パッケージがnpmレジストリに公開される前dist/のファイルからビルドされますが、リポジトリにコミットされることはありません。src/dist/

醜いですが、この場合はから削除dist/して.gitignore実行する必要があります:

npm run build
git add .
git commit
git push

npm install最初に実行したことを確認してください)

その後、githubからインストールできるはずです。

postinstallスクリプトを使用してこれを行う別の方法があるかもしれませんが、それが可能かどうかはわかりません。私はそれを試したことがない。


2
うん、それはほとんど解決策でした。また、npmインストールを実行してGruntFileを少し変更する必要がありましたが、これで機能しました。あなたの助けをありがとう:)
hughesjmh

2
distを無視しない以外に方法はありませんか?元のレポへのPRを行いたいのですが、distを使用すると、彼は気に入らないのですか?
Ka Mok

7
@KaMokもう1つのオプションはpackage.json、フォークのファイルでscripts、の名前prepublishをに変更することprepareです。時に思わnpm installまたはnpm install github:user_name/fork_name --save実行され(糸のために同じ)、それはまた、中に何が実行されるprepareスクリプト。これは、prepublish通常、このパッケージのスクリプトがビルドファイルを作成することを前提としています。
davidfrancisco

5
特定のブランチが必要な場合npm install <ghusername>/<repoName>#branchName
DrMeers '

2
@RyanZimあなたは間違っています。gitからのインストールは、それが適切にセットアップされている限り、非常にうまく機能します。docs.npmjs.com/cli/install「インストールされているパッケージが含まれている場合はprepare、スクリプトを、そのdependenciesとがdevDependenciesインストールされ、パッケージがパッケージ化され、インストールされる前に、スクリプトが実行されます準備します。」
Cameron Tacklind

15

npm 5を使用しているユーザー向けの更新:

npm @ 5以降、prepublishスクリプトは非推奨になりました。

prepareビルドステップとprepublishOnlyアップロードのみに使用します。

"prepare": "npm run build"スクリプトにを追加すると、すべての問題が解決しました。


それも私にとってはうまくいきました(たった今作ったフォークで)—ありがとう!どうして...なぜすべてのパッケージにデフォルトでこのスクリプト設定が含まれていないのですか?パッケージ作成者がnpmからパッケージをインストールするユースケースのみを考慮し、gitリポジトリからパッケージをインストールするケースを考慮していないためですか?だから彼らは手動で実行するのに慣れていてnpm run buildnpm run publishいつかgit経由でリポジトリをインストールしようとしない限り、問題や苦痛に遭遇しないのですか?
タイラーリック

9

npmjs.comに公開されたコードは、多くの場合、パッケージのリポジトリにあるものとは異なります。JavaScriptソースファイルをライブラリで一般的に使用するためのバージョンに「コンパイル」するのが一般的です。それが通常npmjs.comに公開されます。

これは非常に一般的であるため、公開npmする前に「ビルド」ステップを自動的に実行する機能です(npm publish)。これはもともと呼ばれていましたprepublish。それは開発環境を初期化する標準的な方法だっprepublishnpm installので、スクリプトをで実行することもNpmが便利だと思ったようです。

これは結局、コミュニティにいくつかの大きな混乱をもたらしました。これに関してgithubには非常に長い問題があります。

最後に、以前の動作を変更しないための努力で、彼らはさらに2つの自動スクリプトを追加することにしました:prepublishOnlyprepare

prepublishOnlyあなたが期待することをします。上では動作しませんnpm install。多くのパッケージメンテナが盲目的にこれに切り替えました。

しかし、パッケージのバージョンを配布するために人々がnpmjs.comに依存したくないというこの問題もありました。Gitリポジトリは当然の選択でした。ただし、「コンパイルされた」ファイルをgitにコミットしないことが一般的です。それprepareがハンドルに追加されたものです...

prepare 正しい方法です

ソースファイルを含むリポジトリがあるが、それを使用するために「ビルド」ステップが必要な
prepare場合は、すべてのケースで(npm 4の時点で)希望どおりに動作します

prepare:パッケージがパックされて公開される前、npm install引数なしのローカル、gitの依存関係をインストールするときの両方を実行します。

ビルドの依存関係を入れることもでき、実行devDependenciesされる前にインストールprepareされます。

ここでにこのメソッドを使用して私のパッケージの。


の問題 .gitignore

このオプションには、多くの人を惹きつける問題が1つあります。依存関係を準備するとき、NpmとYarnはのセクションにリストされているファイルのみを保持します。filespackage.json

filesデフォルトですべてのファイルが含まれていることがわかり、完了したと思われるかもしれません。見落とされがちなのは、.npmignore ほとんどの場合filesディレクティブ上書きし、.npmignore存在しない場合は.gitignore代わりにが使用されることです。

あなたがに記載されているあなたの建てたファイル持っているのであれば、.gitignore正気の人のように、そして他に何もしない、prepareされますように見える壊れました

filesビルドしたファイルのみを含めるか、空のを追加するように修正すると.npmignore、準備は完了です。

私が推奨するのは、実際に公開されるファイルのみが、公開されたパッケージのユーザーが必要とするファイルのみになるように設定files(または反転.npmignore)することです。Imho、公開されたパッケージにコンパイルされていないソースを含める必要はありません。


元の答え:https : //stackoverflow.com/a/57503862/4612476


1
POSTINSTALL.iの代わりにPREPAREが機能しました。npmrun build in prepareを実行しただけです。
ミリンド、

6

@RyanZimの優れた答えから便乗することは、postinstall間違いなくこのための有効なオプションです。

次のいずれかを実行します。

  1. フォークしたリポジトリのpackage.jsonを更新して、postinstall要素をスクリプトに追加します。ここでは、コンパイルされた出力を取得するために必要なものを実行します(推奨)。
  2. package.jsonを更新し、node_modulesの必要なディレクトリを更新するポストインストールを追加します。

別の人物リポジトリをフォークした場合は、GitHub経由でのパッケージのインストールがスクリプトをビルドするために必要な手段を提供していないため機能しないという問題を説明するために問題を提起する価値があるかもしれません。そこから、ポストインストールでこれを解決するためのPRを受け入れるか、それを拒否して#2を実行できます。


#2を行う方法について説明したり、リソースがありますか?gitrepoにdistではなくsrcのみが含まれている場合、npmのインストール後に実行する必要があるコマンド
Daniel

1
@Daniel謝罪、私は過去にこれを行った場所のコンテキストを思い出そうとしています。#2までに、トップアンサーのステップを実行するpostinstallステップをメインのpackages.jsonに追加するつもりだったので"postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"、アプリケーションの実行前に、問題の原因となっているパッケージが確実にビルドされるようにします。とは言っても、私は自分のユーザーにリポジトリをフォークし、パッケージ自体にポストインストールを追加し、それをアプリケーションで使用する方法を好みます。
マイクB

準備に追加することをお勧めします(@Simonの答え)。npmからインストールする場合、すでにdist / dirが含まれているため、追加のビルドを行う必要がないためです。docs.npmjs.com/misc/scriptsを参照してください。「準備:パッケージをパックして公開する前に、そしてgit依存関係をインストールするときに実行します」
Tyler Rick

postinstall正しい解決策の1ステップ足りません。だけを使用してくださいprepare。それは2020年だ
キャメロンTacklind

2

コマンドを使用するだけnpm install git+https://git@github.com/myRepo/angular-translate.gitです。ありがとう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.