私のプログラミングのキャリアの大部分では、「ビルド/コンパイル/実行」コマンドを何でも使用しましたIDE実行可能なプログラムを作成するために作業しています。これは1つのボタンで、かなり簡単です。しかし、さまざまな言語やフレームワークについてさらに学ぶと、プロジェクトを実行するための「ビルドスクリプト」(ANT、Maven、Gradleなど)の話がますます増えます。これらについての理解は、構成の詳細を指定するコンパイラ/リンカー/魔法のプログラムメーカー-マニューシャ。
私は学校でmakefileを書いたことを覚えていますが、そのとき特別な利点はありませんでした(IDEと便利な「ビルド」ボタンを使用したUnixターミナルで書き込むときにのみ使用しました)それ以外に、ビルドスクリプトがプログラムを作成する以上のことができる方法を議論する他の質問をここで見ました- 彼らはユニットテストを実行できます および secureホストマシンに関係なくリソース 。
ビルドスクリプトは開発者として理解するために重要であるという気持ちを揺さぶることはできませんが、意味のある説明が欲しいのですが。ビルドスクリプトを使用/作成する理由
ビルドスクリプトとビルドサーバーの責任 は、それがより広い範囲で果たす役割について説明します。 IDEの「ビルド/実行」コマンドまたは同様の単純な方法と比較して、ビルドスクリプトによって提供される特定の利点を探しています。
オートメーション。
開発中は、最も単純なプロジェクトでのみ、デフォルトの「ビルド」ボタンが必要なすべてを実行します。 APIからWSを作成する、ドキュメントを生成する、外部リソースとリンクする、サーバーに変更をデプロイするなどが必要になる場合があります。一部のIDEでは、追加のステップまたはビルダーを追加してビルドプロセスをカスタマイズできますが、 IDE商品を通じてビルドスクリプトを生成します。
しかし、システムの開発はコードを書くだけではありません。関与する複数のステップがあります。 IDE独立したスクリプトを自動的に実行できます。つまり、
バージョン管理の変更をコミットすると、サーバーによって新しいビルドを自動的に起動できます。これにより、ビルドに必要なものをコミットするのを忘れていないことが保証されます。
同様に、ビルドが完了した後、テストを自動的に実行して、何かが壊れていないかどうかを確認できます。
これで、組織の残りの部分(QA、sysadmins)は、
a)コントロールバージョンからのみ完全に再現可能です。
b)それらすべてに共通です。
私が一人のチームで働いていたとしても、その目的のためにスクリプトを使用しました。修正プログラムを開発したら、SVNにコミットし、SVNを別のディレクトリにエクスポートし、ビルドスクリプトを使用してソリューションを生成します。ソリューションはその後、運用前システムに移行し、その後運用に移行します。数週間後(私のローカルコードベースが既に変更されている状態で)誰かがバグについて不平を言った場合、システムを正しくデバッグするためにチェックアウトする必要があるSVNリビジョンを正確に把握していました。
コードと同様に、ビルドスクリプトはコンピューターによって実行されます。コンピュータは、一連の指示に従うと例外的に優れているです。実際、(自己変更コードの外で)同じ入力が与えられた場合、コンピュータは同じ命令シーケンスをまったく同じ方法で実行します。これは、まあ、コンピュータだけが一致できるレベルの一貫性を提供します。
対照的に、私たちの水で満たされたフレッシュバッグは、次のステップになるとまったく卑劣です。その厄介な分析脳は、出くわすすべてに疑問を投げかける傾向があります。 「ああ...私はそれをする必要はない」または「本当にこのフラグを使用しますか?えっ...無視します。」さらに、私たちは自己満足する傾向があります。何かを数回行ったら、指示を知っていると信じ始め、指示シートを見る必要はありません。
「実用的なプログラマ」から:
さらに、プロジェクトの一貫性と再現性を確保したいと考えています。手動の手順では、変更まで一貫性が保たれます。繰り返し性は保証されていません。特に、手順のいくつかの側面がさまざまな人々による解釈に対して開かれている場合はそうです。
さらに、命令を実行するのが非常に遅い(コンピューターと比較して)。数百のファイルと構成を持つ大規模なプロジェクトでは、ビルドプロセスのすべてのステップを手動で実行するには何年もかかります。
実例を挙げましょう。私はいくつかの組み込みソフトウェアを使用していましたが、コードのほとんどはいくつかの異なるハードウェアプラットフォーム間で共有されていました。各プラットフォームには異なるハードウェアがありましたが、ほとんどのソフトウェアは同じでした。しかし、各ハードウェアに固有の小さな部分はありませんでした。理想的には、共通部分はライブラリーに配置され、各バージョンにリンクされます。ただし、共通部分を共有ライブラリにコンパイルできませんでした。すべての異なる構成でコンパイルする必要がありました。
最初に、各構成を手動でコンパイルしました。設定を切り替えるのに数秒しかかかりませんでしたし、それほど面倒なことではありませんでした。プロジェクトの終わりに向かって、デバイスが本質的に通信バスを引き継ぐ、コードの共有部分に重大な欠陥が発見されました。これは悪かった!すごく悪い。コードにバグを見つけて修正し、すべてのバージョンを再コンパイルしました。 1つを除いて。ビルドプロセス中に気が散り、1つ忘れてしまいました。バイナリがリリースされ、マシンが構築され、翌日、マシンが応答を停止したという電話がかかってきました。調べてみたところ、デバイスがバスをロックしていることがわかりました。 「しかし、私はそのバグを修正しました!」。
私はそれを修正したかもしれませんが、それがその1つのボードに到達することはありませんでした。どうして?なぜなら、1回のクリックですべてのバージョンをビルドする自動ビルドプロセスがなかったからです。
あなたがやりたいことが<compiler> **/*.<extension>
だけである場合、ビルドスクリプトはほとんど目的を果たしません(ただし、プロジェクトにMakefile
が表示されれば、make
でビルドできることがわかります)。重要なのは、通常、重要なプロジェクトではそれ以上のものが必要になることです。少なくとも、通常、ライブラリを追加し、(プロジェクトが成熟するにつれて)ビルドパラメータを構成する必要があります。
IDEは通常、少なくとも構成可能ですが、ビルドプロセスはIDE固有のオプションに依存しています。 Eclipse を使用していて、Aliceが NetBeans を好み、Bobが IntelliJ IDEA を使用したい場合、構成を共有できません。ソース管理に変更をプッシュする場合、IDEが作成した他の開発者の構成ファイルを手動で編集するか、他の開発者に通知して自分で行う必要があります(つまり、IDE構成は一部のIDEで間違っています...)。
また、チームが使用するすべてのIDEでその変更を行う方法を理解する必要があります。また、それらの1つがその特定の設定をサポートしていない場合...
現在、この問題は文化に依存しています。開発者がIDEを選択しないことは許容できると感じるかもしれません。しかし、IDEの経験を持つ開発者は、通常、それを使用するときにより幸せでより効率的であり、テキストエディターのユーザーは、お気に入りのツールについて熱心に熱心になる傾向があるため、これはあなたが提供したい場所の1つです。開発者への自由-そしてビルドシステムはそれを行うことを可能にします。一部の人々はビルドシステムの設定をしているかもしれませんが、それはIDE /エディタの設定ほど熱狂的ではありません...
すべての開発者に同じIDEを使用しても、ビルドサーバーがそれを使用するようにがんばってください...
さて、これはシンプルなビルドプロセスのカスタマイズのためのものであり、IDEがNice GUIを提供する傾向があります。コンパイル前のソースファイルの前処理/自動生成など、より複雑なものが必要な場合は、通常、IDEの構成内の基本的なテキスト領域にビルド前のスクリプトを記述する必要があります。その部分をコーディングする必要があるビルドシステムはどれですか。ただし、コードを記述した実際のエディターで行うことができます。さらに重要なことは、ビルドシステムのフレームワーク自体が通常、これらのスクリプトを整理するためのサポートを提供することです。
最後に、ビルドシステムは、プロジェクトをビルドするだけでなく、チームの全員が実行する必要がある他のタスクを実行するようにプログラムすることができます。 Ruby on Rails には、たとえば、データベースの移行を実行したり、一時ファイルをクリーンアップしたりするためのビルドシステムタスクがあります。これらのタスクをビルドシステムに配置すると、チームの全員が一貫してタスクを実行できます。
多くのIDEは、何かを構築するために使用されるコマンドをパッケージ化し、スクリプトを生成して呼び出すだけです。
たとえば、Visual Studioでは、[コマンドライン]ボックスにC++コンパイルのコマンドラインパラメーターを表示できます。ビルド出力をよく見ると、コンパイルの実行に使用されたビルドスクリプトを含む一時ファイルが表示されます。
今日ではすべて MSBuild ですが、それでもIDEによって直接実行されます。
したがって、コマンドラインを使用する理由は、ソースに直接移動して、更新されていないか、ヘッドレスサーバーで不要または不要な依存関係のヒープを必要とする仲介者をスキップするためです。 継続的インテグレーション (CI)サーバーとして機能します。
さらに、スクリプトは、通常の開発者向けの手順よりも多くのことを実行します。たとえば、ビルド後、バイナリをパッケージ化して特別な場所にコピーしたり、インストーラーパッケージを作成したり、ドキュメントツールを実行したりできます。開発者のマシンでは無意味な多くの異なるタスクがCIサーバーによって実行されるため、IDEプロジェクトを作成してこれらのすべてのステップを実行する場合、2つのタスクを維持する必要があります-開発者用のプロジェクトとビルド用のプロジェクトです。一部のビルドタスク(静的分析など)には、開発者プロジェクトでは望まないほど長い時間がかかる場合があります。
要するに、簡単なことです。必要なすべてのことを実行するスクリプトを作成し、それをコマンドラインまたはビルドサーバー構成で開始するのはすばやく簡単です。
make
覚えて入力するよりもはるかに簡単です
gcc -o myapp -I/include/this/dir -I/include/here/as/well -I/dont/forget/this/one src/myapp.c src/myapp.h src/things/*.c src/things/*.h
また、プロジェクトには非常に複雑なコンパイルコマンドが含まれる場合があります。ビルドスクリプトには、変更されたものだけを再コンパイルする機能もあります。クリーンビルドを行う場合は、
make clean
適切に設定されていれば、中間ファイルが生成された可能性のあるあらゆる場所を覚えておくよりも簡単で信頼性が高くなります。
もちろん、IDEを使用している場合は、ビルドまたはクリーンボタンをクリックするのも簡単です。ただし、画面上の特定の場所へのカーソルの移動を自動化することは、単純なテキストコマンドを自動化することよりも、ウィンドウが移動するとその場所が移動する可能性がある場合に特に困難です。
上記の回答は十分な根拠をカバーしていますが、追加したい(カルマがないためコメントとして追加できない)実例は、Android =プログラミング。
私はプロのAndroid/iOS/Windows Phone開発者であり、GoogleサービスAPI(主にGoogleマップ)alotを使用しています。
Androidでは、これらのサービスでは、keystore、またはGoogleに自分であることを通知する開発者IDファイルのタイプを追加する必要があります私が言っているのは、開発者コンソールです。アプリが別のキーストアでコンパイルされている場合、アプリのGoogleマップセクションが機能しません。
開発者コンソールにダースキーストアを追加して管理する代わりに、実際にアプリの更新に使用できるのはそのうちの1つだけです。このキーストアを安全なリポジトリに含め、Gradleを使用してAndroid 「デバッグ」または「リリース」用にビルドするときに使用するキーストアを正確にスタジオします。これで、Googleデベロッパーコンソールに2つのキーストアを追加するだけで済みます。1つは「デバッグ」用、もう1つは「リリース」用で、チームメンバー全員がリポジトリを複製して、開発コンソールに移動せずに開発に取り掛かり、SHA特定のキーストアのハッシュ、またはさらに悪いことに私がそれらを管理します。これには、各チームメンバーに署名キーストアのコピーを提供するという追加の利点があります。つまり、私が不在で更新がスケジュールされている場合、チームメンバーは必要なだけです。アップデートをプッシュするための非常に短い手順のリストに従う。
このようなビルドの自動化により、ビルドの一貫性が維持され、新しい開発者や新しいマシンを取得するとき、またはマシンのイメージを再作成する必要があるときに、セットアップ時間を大幅に削減して、技術的負担が軽減されます。
他にどのようにしますか?他の唯一の方法は、1つの長いコマンドラインコマンドを指定することです。
もう1つの理由は、メイクファイルでインクリメンタルコンパイルが可能になり、コンパイル時間が大幅に短縮されるためです。
Makefileは、ビルドプロセスをクロスプラットフォームにすることもできます。 CMakeは、プラットフォームに基づいて異なるビルドスクリプトを生成します。
編集:
IDEを使用すると、特定の方法で作業を行うことができます。 IDEに似た機能は多くありませんが、多くの人がvimまたはemacsを使用しています。彼らがそうするのは、彼らがこれらのエディターが提供するパワーを望んでいるからです。 IDEを使用しない場合は、ビルドスクリプトが必要です。
IDEを使用している場合でも、何が起こっているのかを本当に知りたいと思うかもしれません。そのため、ビルドスクリプトは、GUIアプローチにはない実装の詳細を提供します。
IDE自体も内部でスクリプトをビルドすることがよくあります。実行ボタンは、makeコマンドを実行するもう1つの方法です。
ビルドスクリプトの利点:
変更は、ダイアログの異なるチェック済みオプションではなく、コードのように見えます(たとえば、git diffコマンドで)
単純なビルドよりも多くの出力を作成する
以前のいくつかのプロジェクトでは、ビルドスクリプトを使用して次のことを行いました。
多くの場合、「ビルド」ボタンは自動化された方法で呼び出すことができます(たとえば、Visual Studioはコマンドライン引数を受け入れます)。人々は、ビルドボタンが提供できない何かが必要になるとすぐにビルドスクリプトを記述します。
たとえば、ほとんどのIDEでは、一度に1つのプラットフォームしかビルドできません。または、一度に1つだけlanguage。次に、ビルドされた出力を使用して何をしますか?IDEそれらをすべてインストールパッケージにまとめることができますか?