GNU Wget

確実性

Wgetは低速あるいは不安定なネットワーク接続でも確実に動作するように設計されている。もしダウンロードがネットワークの問題によって完了しなかった場合、Wgetは自動的にダウンロードが停止した箇所からダウンロードを継続するように試み、ファイル全体が取得されるまでこれを繰り返す。Wgetは、この機能を利用するため、当時としては新しかったRangeHTTPヘッダをもっとも早期に採用したクライアントの一つとなった。

再帰的ダウンロード

Wgetをクローラとして動作させることも可能である。クローラとして動作するとき、Wgetは、リソースのハイパーリンクをHTMLのウェブページから抽出し、それらを連続してダウンロードし、ユーザーによって指定された最大繰り返しの回数に達するまで再帰的に繰り返す。ダウンロードされたページは、リモートのサーバのディレクトリ構成に類似したディレクトリ構成に保存される。この「再帰的ダウンロード」はHTTPによるウェブサイトの部分的もしくは完全なミラーリングを可能にする。Wgetは、ダウンロードされたHTMLページ内のリンクを、オフラインでの閲覧のため、ローカルにダウンロードされた素材に向けられるよう調整することもできる。この種のウェブサイトの自動的ミラーリングを行うときには、(ユーザーがオプションとして-e robots=offを指定しない限り)WgetはRobots Exclusion Standardを遵守する。
再帰的ダウンロードはFTPでも同様に動作する。その際、Wgetはダウンロード対象となるファイルを発見するためにLISTコマンドを発行する。そしてトップのURLで指定されたものより下位のファイルとディレクトリに関してこのプロセスを繰り返す。FTPのURLのダウンロードが要求された場合には、シェル類似のワイルドカードが利用できる。
HTTPを用いる場合でもFTPを用いる場合でも、再帰的ダウンロードを行う際には、Wgetにローカル及びリモートのファイルのタイムスタンプを調べ、リモートファイルが相当するローカルファイルより新しい場合にのみダウンロードを行うように命令することができる。これによりHTTP及びFTPサイトの容易なミラーリングが可能になるが、これはrsyncのように、最初からミラーリングを行うために設計されたプログラムに比べ非効率でよりエラーを生じやすいと考えられている。一方で、Wgetはこの作業のために特別なサーバ側のソフトウェアを必要としないという利点もある。

非対話性

Wgetは非対話的なプログラムである。つまり、一度起動すれば、Wgetはユーザーとの対話を必要とせずTTYをコントロールする必要もなく、進捗状況は（後の調査のため）別のファイルに記録しておくこともできるということである。そういった非対話的な形でユーザーはWgetを起動し、プログラムを監視することもせずログアウトすることができる。対照的に、ほとんどのグラフィカルユーザインタフェースあるいはテキストユーザインタフェースのウェブブラウザは、ユーザーがログインし続けることと、失敗したダウンロードを手動で再度スタートすることを求める。これは大量のデータを転送する際には大きな障害となりうる。

移植性

Wgetは、サードパーティーのライブラリに対する依存性を最小限にした、C言語の移植性の高いスタイルで記述されている。Wgetには、C言語コンパイラとTCP/IPネットワーキングに対するBSDライクなインタフェースの他にはほとんど必要なものはない。WgetはUnixシェルから呼び出されるUNIXプログラムとして設計されたため、多くのUnix系環境やシステムに移植されている。それはWindows及びmacOSなどを含んでいる。

著者と著作権

GNU WgetはHrvoje Nikšićによって書かれた。彼のほかDan Harkless、Ian Abbott、Mauro Tortonesiなど多くの人々がWgetに寄稿している。主要な寄稿者達は配布物に含まれるAUTHORSファイルにクレジットされている。その他多くの人々は配布物に含まれるchangelogに記載されている。現在、WgetはGiuseppe Scrivanoによってメンテナンスされている。
Wgetの著作権はフリーソフトウェア財団に所属する。GNUソフトウェアに対する重要な寄稿全てに対して著作権譲渡を要求するというのがフリーソフトウェア財団のポリシーである。

初期

Wgetは同じ作者による以前のプログラムGeturlの後継である。Geturlの開発は1995年後半に始まった。ところが作者は、以前ジェイムズ・バートンがAmiga用にAREXXで書いたGetURLというプログラムがあることに気づいた。その後、名称はWgetに改められた。
Wgetは1990年代半ばに利用可能であったウェブダウンロードソフトウェアの間隙を埋めるものだった。HTTPとFTPの両方のプロトコルで確実にファイルをダウンロードできるプログラムは一つもなかった。当時存在したプログラムは(NcFTPやdlのように)FTPのみ利用可能だったか(当時はまだ、どこでも利用できるようなものではなかった)Perlで書かれたものだった。Wgetは当時すでにあったプログラムの機能に刺激を受けてはいたものの、このプロジェクトの目標はHTTPとFTPの両方を利用可能にすることと、ユーザーがどのUnixシステムにもある標準的な開発ツールのみを用いてWgetをビルドできるようにすることだった。
当時多くのUnixユーザーは、極端に遅い大学とダイヤルアップ接続のインターネット接続に苦しんでいた。このため、操作する人間が補助しなくとも一過性のネットワーク障害に対処できるダウンロードエージェントに対するニーズが増大していた。

開発とリリースのサイクル

Wgetの開発はオープンな流儀で行われている。ほとんどの設計上の決定は、通常はユーザーと開発者が参加する公開のメーリングリストで行われている。バグリポートとパッチも同じメーリングリストに流される。

ソースの投稿

Wgetのコードやドキュメンテーションを投稿する際に好まれる方法はdiffユーティリティによって生成されるテキストのパッチの形でソースを更新することである。パッチをWgetに含めようとする場合は、メーリングリストに投稿されメンテナによってレビューされる。メンテナの検査を通過したパッチはソースに加えられる。パッチの作り方とスタイルのガイドラインはプロジェクトのwikiに概略が示されている。
ソースコードは、リリース1.5.3に始まる改訂の歴史を保存するリモートバージョンコントロールリポジトリで追跡することができる。リポジトリはMercurialで管理されている。以前はSubversion、さらにその前はCVSで管理されていた。

リリース

開発中に十分な数の機能あるいはバグフィックスが集積したときに、WgetはGNUのFTPサイト及びそのミラーサイトを通じて一般に公開される。プロジェクトは完全にボランティアによって運営されているので、リリースを発表することについて外部からの圧力はなく、強制力のあるリリースの締め切りもない。
リリースにはメジャー.マイナー.リビジョンという形式でバージョンナンバーが振られている。(例)Wget 1.11、Wget 1.8.2。メジャーバージョンナンバーが増加されるのは、大きなそして場合によっては非互換となるようなWgetの動作の変更あるいはコードベースの根本的な再設計がある場合である。マイナーバージョンナンバーが増加されるのは新しい機能の追加とバグフィックスを示す場合である。新しいリビジョンは、その前のリビジョンに比較して、バグフィックスのみが含まれていることを示している。リビジョン ゼロは省略される。つまりWget 1.11は1.11.0と同じことである。

ライセンス

GNU WgetはGNU General Public Licenseバージョン3以降のもとで、OpenSSLライブラリにリンクされたバイナリの配布を許可するという特別な例外をつけて配布されている。例外規定は以下の通りである:
Additional permission under GNU GPL version 3 section 7
If you modify this program, or any covered work, by linking or
combining it with the OpenSSL project's OpenSSL library (or a
modified version of that library), containing parts covered by the
terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
grants you additional permission to convey the resulting work.
Corresponding Source for a non-source form of such a combination
shall include the source code for the parts of OpenSSL used as well
as that of the covered work.
WgetがGnuTLSライブラリにリンクできるように改良された際にはこの例外規定が削除されることが期待されている。
Wgetの ドキュメンテーションは Texinfoリファレンスマニュアルの形態で、GNU Free Documentation Licenseバージョン1.2以降の条件で配布されている。通常Unixライクなシステムで配布されているman pageはTexinfoマニュアルのサブセットから自動的に生成され、同じライセンスが適用される。

国際化

WgetはGNU gettextによる国際化に対応している。Unixライクなシステムでは環境変数を適切に設定することで母語を表示させることができる。Wget-1.12では日本語を含め30以上の言語に対応している。