{"id":18103924,"url":"https://github.com/dearblue/ruby-invfs","last_synced_at":"2026-02-01T11:31:17.385Z","repository":{"id":56877875,"uuid":"80201995","full_name":"dearblue/ruby-invfs","owner":"dearblue","description":"customization \"require\" in VFS support","archived":false,"fork":false,"pushed_at":"2018-01-13T15:28:58.000Z","size":26,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-12T01:38:07.568Z","etag":null,"topics":["require","ruby","vfs"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dearblue.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-27T11:24:43.000Z","updated_at":"2024-01-16T23:01:40.000Z","dependencies_parsed_at":"2022-08-20T11:21:49.679Z","dependency_job_id":null,"html_url":"https://github.com/dearblue/ruby-invfs","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/dearblue/ruby-invfs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dearblue%2Fruby-invfs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dearblue%2Fruby-invfs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dearblue%2Fruby-invfs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dearblue%2Fruby-invfs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dearblue","download_url":"https://codeload.github.com/dearblue/ruby-invfs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dearblue%2Fruby-invfs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28977318,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T11:31:13.034Z","status":"ssl_error","status_checked_at":"2026-02-01T11:30:25.558Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["require","ruby","vfs"],"created_at":"2024-10-31T22:13:33.113Z","updated_at":"2026-02-01T11:31:17.365Z","avatar_url":"https://github.com/dearblue.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# invfs - customization \"require\" in VFS support\n\nruby の ``require`` に仮想ファイルシステム (VFS; Virtual Filesystem) 対応機能を追加します。\n\n  * package name: [invfs](https://github.com/dearblue/ruby-invfs)\n  * version: 0.3.1\n  * production quality: CONCEPT, EXPERIMENTAL, UNSTABLE\n  * license: [BSD-2-clause License](https://github.com/dearblue/ruby-invfs/blob/0.3.1/LICENSE)\n  * author: dearblue (\u003cmailto:dearblue@users.noreply.github.com\u003e)\n  * report issue to: \u003chttps://github.com/dearblue/ruby-invfs/issues\u003e\n  * dependency ruby: ruby-2.2+\n  * dependency ruby gems:\n      * rubyzip-1.2.0 (BSD-2-Clause)\n          * https://github.com/rubyzip/rubyzip\n          * https://rubygems.org/gems/rubyzip\n  * dependency library: (none)\n  * bundled external C library: (none)\n\n\n## How to install (インストールの仕方)\n\n```shell\n# gem install invfs\n```\n\n\n## How to use (使い方)\n\nこの例では ``mybox.zip`` という Zip 書庫ファイルの中に ``mybox/core.rb``\nという Ruby スクリプトファイルが存在しているものとして解説を進めていきます。\n\nmybox.zip の中身:\n\n```text\n$ unzip -v mybox.zip\nArchive:  mybox.zip\n Length   Method    Size  Cmpr    Date    Time   CRC-32   Name\n--------  ------  ------- ---- ---------- ----- --------  ----\n      69  Defl:X       60  13% 01-26-2017 00:24 8d7bd341  mybox/core.rb\n--------          -------  ---                            -------\n      69               60  13%                            1 file\n```\n\nmybox/core.rb の中身:\n\n```text\n$ unzip -p mybox.zip mybox/core.rb\nmodule MyBox\n  def MyBox.sayhello!\n    puts \"Hello, Ruby!\"\n  end\nend\n```\n\nRuby スクリプトで実際に利用する場合は次のようにします:\n\n```ruby:ruby\nrequire \"invfs/zip\"           # (1)\n\n$: \u003c\u003c InVFS.zip(\"mybox.zip\")  # (2)\n\nrequire \"mybox/core\"          # (3)\n\nMyBox.sayhello!\n# =\u003e Hello, Ruby!\n```\n\n 1. ``require \"invfs\"`` すると、それ以降で VFS を探す機能が利用できるようになります。\n\n    ``require \"invfs/zip\"`` すると、rubyzip を用いて zip 書庫ファイルから読み込めるようになります。\n\n 2. ``$:`` に VFS としての機能を持った任意のオブジェクトを追加します。\n\n    ``$: \u003c\u003c InVFS.zip(\"mybox.zip\")`` の部分です。\n\n 3. ``require`` で任意のライブラリを指定します。\n\n    VFS 内から同じ VFS のファイルを指定したい場合、``require_relative`` も利用できます。\n\n\n## VFS オブジェクトについて\n\nVFS オブジェクトは ``$:`` に追加する、利用者定義のロードパスと見せかけるオブジェクトです。\n\nこのオブジェクトは、以下のメソッドが要求されます。\n\n  * ``.to_path() -\u003e string``\n  * ``.file?(path) -\u003e true or false``\n  * ``.size(path) -\u003e integer``\n  * ``.read(path) -\u003e string as binary``\n\n実際にどのように定義すればいいのかについては、[InVFS::Zip](lib/invfs/zip.rb) あるいは [InVFS::UnionFS](lib/invfs/unionfs.rb)、[InVFS::StringMapFS](lib/invfs/stringmapfs.rb) を参考にして下さい。\n\n### ``.to_path() -\u003e string``\n\nロードパスに変換するためのメソッドです。\n\n***文字列を返してください。***\n\nruby が提供する本来の require の内部や File.join が ``to_path`` して、\n文字列以外を文字列に変換するために呼びます\n(``file.c:rb_get_path_check_to_string``)。\n\n### ``.file?(path) -\u003e true or false``\n\nVFS 内部にファイルが存在するかを確認するためのメソッドです。\n\n***真偽値を返して下さい。***\n\npath に関して発生した例外は出来る限り捕捉して、false を返すべきです。\n\n### ``.size(path) -\u003e integer``\n\nファイルサイズを取得するためのメソッドです。\n\n***0 以上の整数値を返して下さい。***\n\n### ``.read(path) -\u003e string as binary``\n\nVFS からファイルを読み込むためのメソッドです。\n\n***文字列、または nil を返して下さい。***\n\n\n## VFS ハンドラ\n\n``$:`` にファイルを追加した場合、``require`` 時に VFS と解釈可能であれば、内部的にそのファイルを VFS として扱われる機能です。\n\n前にあった例を書き換えた場合の利用例を示します。(2) の部分です。\n\n```ruby\nrequire \"invfs/zip\"   # (1)\n\n$: \u003c\u003c \"mybox.zip\"     # (2)\n\nrequire \"mybox/core\"  # (3)\n\nMyBox.sayhello!\n```\n\nVFS ハンドラを利用したい場合は、``.probe`` と ``.open`` メソッドを持ったオブジェクトを ``InVFS.regist`` で登録して下さい。\n\n```ruby\nclass VFSHandler\n  def VFSHandler.probe(file)\n    # check available as VFS\n  end\n\n  def VFSHandler.open(file)\n    # open as VFS\n  end\n\n  InVFS.regist self\nend\n```\n\n実際にどのようにつかっているのかについては、[InVFS::Zip](lib/invfs/zip.rb) を見て下さい。\n\n\n## Environment Variables (環境変数について)\n\n  * ``RUBY_REQUIRE_INVFS_MAX_LOADSIZE`` :: 読み込みファイルの最大ファイルサイズの指定\n\n    VFS 内における読み込み対象ファイルの最大ファイルサイズを指定することが出来ます。\n\n    数値に続けて接頭辞を付けることが出来ます。以下は 64 MiB とした時の指定です。\n\n    ```shell\n    $ export RUBY_REQUIRE_INVFS_MAX_LOADSIZE=64mib\n    ```\n\n    最小値は 256 KiB、最大値は 64 MiB、既定値は 2 MiB となっています。\n\n\n## 課題\n\n  * セキュリティレベル? なにそれおいしいの?\n\n  * マルチスレッド? なにそれおいしいの?\n\n    複数のスレッドで VFS 内のファイルを指定した場合は、``$LOADED_FEATURES``\n    に不整合が起きる可能性がある。\n\n  * ``require`` / ``require_relative`` の探索速度がとても遅い。\n\n    ``require \"invfs\"`` しただけで、3倍以上遅くなる。\n\n    VFS 内の ``.so`` ファイルの読み込みにいたっては、10倍以上遅くなる。\n\n  * VFS オブジェクトのシグネチャが変動すると不整合が起きる。\n\n    ``$LOAD_PATH`` に追加された VFS オブジェクトのシグネチャ (``.to_path``)\n    が変動すると、同じライブラリを ``require`` した時に ``$LOADED_FEATURES``\n    と一致しなくなるため、再読み込みしてしまう。\n\n    シグネチャの解決に ``.object_id`` などを用いるべき?\n\n    =\u003e ``require_relative`` したファイルの VFS が決定しやすくなるが、ファイルパス名\n    (VFS 名) が暗号みたくなって特定しづらそう。\n\n  * ``require`` した後に ``$LOAD_PATH`` から VFS オブジェクトを除去すると ``require_relative`` で不具合が起きる。\n\n  * パス解決の正確性を向上させるか?\n\n    ライブラリへの指定が相対パスで、シンボリックリンクが絡んでくると不正確になる。\n\n  * ``require`` されたファイルが VFS から取り出されたのかを確認する処理は文字列の比較であるため不正確。\n\n    これは直接 ``require_relative`` する時の VFS を確認する処理に関係してくる。\n\n    ``caller_locations`` で VFS の直接確認が出来るようにするためには ruby の\n    C コードに手を入れなきゃなんないし諦める。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdearblue%2Fruby-invfs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdearblue%2Fruby-invfs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdearblue%2Fruby-invfs/lists"}