CompUnit::Repository::FileSystem — 파일시스템 기반 저장소

CompUnit::Repository::FileSystem — 파일시스템 기반 저장소

개발 중에는 -I lib처럼 파일시스템 경로를 직접 추가해서 모듈을 찾아요. 그때 동작하는 저장소가 바로 CompUnit::Repository::FileSystem입니다.

출처: Raku 공식 문서 — CompUnit::Repository::FileSystem

본문

class CompUnit::Repository::FileSystem
    does CompUnit::Repository::Locally
    does CompUnit::Repository
    { }

파일시스템으로 구현된 CompUnit::Repository로, 주로 개발 상황에서 쓰여요. -I . / -I lib(실제로는 -I file#.-I file#lib)나 use lib "." / use lib "lib"이 사용하는 것이 바로 이 저장소예요. CompUnit::Repository::Installation과 달리, 이 저장소는 단일 배포판을 나타냅니다.

메서드

method candidates

multi method candidates(Str:D $name, :$auth, :$ver, :$api)
multi method candidates(CompUnit::DependencySpecification $spec)

지정된 $name, auth, ver, api와 일치하는 모듈을 담은 모든 배포판을 반환해요.

# zef git 저장소 중 하나로 클론했다고 가정하면...
my $repo = CompUnit::Repository::FileSystem.new(prefix => $*CWD);
with $repo.candidates("Zef").head -> $dist {
    say "Zef version: " ~ $dist.meta<version>;
}
else {
    say "No candidates for 'Zef' found";
}

method files

multi method files(Str:D $name, :$auth, :$ver, :$api)
multi method files(CompUnit::DependencySpecification $spec)

지정된 auth ver api와 일치하면서, 지정된 $name과 일치하는 비모듈 파일을 담은 모든 배포판을 반환해요.

# zef git 저장소 중 하나로 클론했다고 가정하면...
my $repo = CompUnit::Repository::FileSystem.new(prefix => $*CWD);
say $repo.files('bin/zef', :ver<419.0+>).head.<name>              // "Nada"; # OUTPUT: «Nada␤»
say $repo.files('resources/config.txt', :ver<419.0+>).head.<name> // "Nada"; # OUTPUT: «Nada␤»

say $repo.files('bin/zef', :ver<0.4.0+>).head.<name>;                        # OUTPUT: «zef␤»
say $repo.files('resources/config.txt', :ver<0.4.0+>).head.<name>;           # OUTPUT: «zef␤»

method resolve

method resolve(CompUnit::DependencySpecification $spec --> CompUnit:D)

$spec와 일치하는 배포판의 어떤 버전이라도 담고 있는 저장소 체인에서 첫 번째 저장소를 기준으로, $spec와 일치하는 최고 버전 배포판에 매핑된 CompUnit을 반환해요.

method need

method need(
    CompUnit::DependencySpecification $spec,
    CompUnit::PrecompilationRepository $precomp = self.precomp-repository(),
    CompUnit::PrecompilationStore :@precomp-stores = self!precomp-stores(),
    --> CompUnit:D)

$spec와 일치하는 배포판의 어떤 버전이라도 담고 있는 저장소 체인에서 첫 번째 저장소를 기준으로, $spec와 일치하는 최고 버전 배포판에 매핑된 CompUnit을 불러와 반환해요.

method load

method load(IO::Path:D $file --> CompUnit:D)

$file을 불러와 그 파일을 나타내는 CompUnit 객체를 반환해요.

method loaded

method loaded(--> Iterable:D)

이 저장소가 불러온 모든 CompUnit을 반환해요.

method short-id

method short-id()

저장소의 짧은 ID를 반환하는데, 이 저장소는 file이에요.

attribute extensions

my $repo = CompUnit::RepositoryFileSystem.new(:prefix($*CWD));
say $repo.extensions; # OUTPUT: «[rakumod pm6 pm]␤»

prefix에 META6.json 파일이 없을 때 저장소가 raku 모듈로 간주할 파일들의 확장자예요. 경로 스펙을 통해 이 애트리뷰트를 설정해서 라이브러리 경로 자체를 포함시킬 때 지정할 수 있어요.

    # '-I lib'와 같지만, .rakumod와 .pm6 파일만 raku 모듈로 간주함
    raku -I "file#extensions<rakumod pm6>#lib" -e 'use MyModule'