├── Dockerfile.alpine ├── Dockerfile.chainguard ├── Dockerfile.perl ├── README.md ├── bin └── lambda-bootstrap ├── build ├── layers └── devel │ ├── cpanfile │ └── cpanfile.snapshot ├── scripts ├── pdi-build-deps ├── pdi-cpanfile ├── pdi-entrypoint ├── pdi-perl-env └── pdi-run-tests └── test ├── basic ├── Dockerfile ├── cpanfile ├── cpanfile.snapshot ├── run └── t │ ├── env.t │ └── https.t └── lambda ├── Dockerfile ├── cpanfile ├── cpanfile.snapshot ├── lambda-handlers └── handler.pl └── test.sh /Dockerfile.alpine: -------------------------------------------------------------------------------- 1 | ## The Alpine base image version 2 | 3 | ## 3.18 is the latest "safest" version 4 | ARG BASE=alpine:3.18 5 | 6 | ## The main event 7 | FROM ${BASE} AS runtime-base 8 | 9 | RUN apk --no-cache add curl wget perl make ca-certificates zlib openssl \ 10 | zlib expat gnupg libxml2 libxml2-utils jq tzdata \ 11 | build-base perl-dev \ 12 | && apk --no-cache upgrade \ 13 | && curl -L https://cpanmin.us | perl - App::cpanminus \ 14 | && cpanm -n -q Carton App::cpm Path::Tiny Digest::SHA \ 15 | autodie Module::CPANfile CPAN::Meta::Prereqs \ 16 | AWS::Lambda AWS::XRay \ 17 | && rm -rf ~/.cpanm \ 18 | && apk --no-cache del build-base perl-dev \ 19 | && mkdir -p /app /deps /stack 20 | 21 | 22 | ## AWS Lambda Emulator support 23 | ARG AWS_LAMBDA_RIE_URL_aarch64="unknown" 24 | ARG AWS_LAMBDA_RIE_SIG_aarch64="unknown" 25 | ARG AWS_LAMBDA_RIE_URL_x86_64="unknown" 26 | ARG AWS_LAMBDA_RIE_SIG_x86_64="unknown" 27 | 28 | RUN mkdir -p /usr/local/bin \ 29 | && cd /usr/local/bin \ 30 | && arch=`uname -m` \ 31 | && url="AWS_LAMBDA_RIE_URL_$arch" \ 32 | && sig="AWS_LAMBDA_RIE_SIG_$arch" \ 33 | && echo ">>>> arch $arch" \ 34 | && sh -c "echo '>>>> url ' \${$url}" \ 35 | && sh -c "echo '>>>> sig ' \${$sig}" \ 36 | && sh -c "curl -Lo ./aws-lambda-rie \${$url}" \ 37 | && chmod +x ./aws-lambda-rie \ 38 | && sh -c "echo \${$sig} ' aws-lambda-rie'" > ./.sig \ 39 | && sha256sum -c .sig \ 40 | && rm .sig 41 | 42 | 43 | ## The setup... 44 | ENV PATH=/app/bin:/deps/bin:/deps/local/bin:/stack/bin:/stack/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 45 | WORKDIR /app 46 | ENTRYPOINT [ "/usr/bin/pdi-entrypoint" ] 47 | 48 | 49 | ## The Build version 50 | FROM runtime-base AS build-base 51 | 52 | RUN apk --no-cache add build-base zlib-dev perl-dev openssl-dev \ 53 | expat-dev libxml2-dev perl-utils \ 54 | && apk --no-cache upgrade 55 | 56 | 57 | ## Our files 58 | FROM scratch AS project 59 | 60 | COPY bin/lambda-bootstrap /var/runtime/bootstrap 61 | COPY layers/ cpanfile* /deps/layers/ 62 | COPY scripts/ /usr/bin/ 63 | 64 | 65 | ## Final Versions: Development 66 | FROM build-base AS devel 67 | COPY --from=project / / 68 | 69 | RUN pdi-build-deps --layer=devel \ 70 | && echo 'eval $( pdi-perl-env )' > /etc/profile.d/perl_env.sh 71 | 72 | 73 | ## Final Versions: Build 74 | FROM build-base AS build 75 | COPY --from=project / / 76 | 77 | 78 | ## Final Versions: Runtime 79 | FROM runtime-base AS runtime 80 | COPY --from=project / / 81 | 82 | 83 | ## Final Versions: Repl 84 | FROM devel AS reply 85 | RUN /usr/local/bin/cpm install --no-test Reply && rm -rf /root/.perl-cpm 86 | 87 | CMD ["reply"] 88 | -------------------------------------------------------------------------------- /Dockerfile.chainguard: -------------------------------------------------------------------------------- 1 | ## The Chainguard base image version 2 | 3 | ARG BASE=cgr.dev/chainguard/wolfi-base 4 | 5 | ## The main event 6 | FROM ${BASE} AS runtime-base 7 | 8 | RUN apk --no-cache add curl wget perl make ca-certificates zlib openssl \ 9 | zlib expat gnupg libxml2 libxml2-utils jq tzdata \ 10 | build-base perl-dev \ 11 | && apk --no-cache upgrade \ 12 | && curl -L https://cpanmin.us | perl - App::cpanminus \ 13 | && cpanm -n -q Carton App::cpm Path::Tiny Digest::SHA \ 14 | autodie Module::CPANfile CPAN::Meta::Prereqs \ 15 | AWS::Lambda AWS::XRay \ 16 | && rm -rf ~/.cpanm \ 17 | && apk --no-cache del build-base perl-dev \ 18 | && mkdir -p /app /deps /stack 19 | 20 | 21 | ## AWS Lambda Emulator support 22 | ARG AWS_LAMBDA_RIE_URL_aarch64="unknown" 23 | ARG AWS_LAMBDA_RIE_SIG_aarch64="unknown" 24 | ARG AWS_LAMBDA_RIE_URL_x86_64="unknown" 25 | ARG AWS_LAMBDA_RIE_SIG_x86_64="unknown" 26 | 27 | RUN mkdir -p /usr/local/bin \ 28 | && cd /usr/local/bin \ 29 | && arch=`uname -m` \ 30 | && url="AWS_LAMBDA_RIE_URL_$arch" \ 31 | && sig="AWS_LAMBDA_RIE_SIG_$arch" \ 32 | && echo ">>>> arch $arch" \ 33 | && sh -c "echo '>>>> url ' \${$url}" \ 34 | && sh -c "echo '>>>> sig ' \${$sig}" \ 35 | && sh -c "curl -Lo ./aws-lambda-rie \${$url}" \ 36 | && chmod +x ./aws-lambda-rie \ 37 | && sh -c "echo \${$sig} ' aws-lambda-rie'" > ./.sig \ 38 | && sha256sum -c .sig \ 39 | && rm .sig 40 | 41 | 42 | ## The setup... 43 | ENV PATH=/app/bin:/deps/bin:/deps/local/bin:/stack/bin:/stack/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 44 | WORKDIR /app 45 | ENTRYPOINT [ "/usr/bin/pdi-entrypoint" ] 46 | 47 | 48 | ## The Build version 49 | FROM runtime-base AS build-base 50 | 51 | RUN apk --no-cache add build-base zlib-dev perl-dev openssl-dev \ 52 | expat-dev libxml2-dev perl-utils \ 53 | && apk --no-cache upgrade 54 | 55 | 56 | ## Our files 57 | FROM scratch AS project 58 | 59 | COPY bin/lambda-bootstrap /var/runtime/bootstrap 60 | COPY layers/ cpanfile* /deps/layers/ 61 | COPY scripts/ /usr/bin/ 62 | 63 | 64 | ## Final Versions: Development 65 | FROM build-base AS devel 66 | COPY --from=project / / 67 | 68 | RUN pdi-build-deps --layer=devel \ 69 | && echo 'eval $( pdi-perl-env )' > /etc/profile.d/perl_env.sh 70 | 71 | 72 | ## Final Versions: Build 73 | FROM build-base AS build 74 | COPY --from=project / / 75 | 76 | 77 | ## Final Versions: Runtime 78 | FROM runtime-base AS runtime 79 | COPY --from=project / / 80 | 81 | 82 | ## Final Versions: Repl 83 | FROM devel AS reply 84 | RUN /usr/local/bin/cpm install --no-test Reply && rm -rf /root/.perl-cpm 85 | 86 | CMD ["reply"] 87 | -------------------------------------------------------------------------------- /Dockerfile.perl: -------------------------------------------------------------------------------- 1 | ## The Perl Official version 2 | ARG BASE=perl:5.38-slim 3 | 4 | ## The main event... 5 | FROM ${BASE} AS runtime-base 6 | 7 | RUN apt update \ 8 | && apt install -y --no-install-recommends \ 9 | curl wget make zlib1g libssl3 libexpat1 gnupg libxml2 libxml2-utils jq \ 10 | build-essential \ 11 | && apt upgrade -y \ 12 | && cpm install -g Carton Path::Tiny autodie Module::CPANfile CPAN::Meta::Prereqs \ 13 | App::cpm Carton::Snapshot AWS::Lambda AWS::XRay Digest::SHA \ 14 | && rm -rf ~/.cpanm \ 15 | && mkdir -p /app /deps /stack \ 16 | && apt purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ 17 | && apt autoremove -y build-essential \ 18 | && rm -fr /var/cache/apt/* /var/lib/apt/lists/* /var/cache/debconf/* 19 | 20 | 21 | ## AWS Lambda Emulator support 22 | ARG AWS_LAMBDA_RIE_URL_aarch64="unknown" 23 | ARG AWS_LAMBDA_RIE_SIG_aarch64="unknown" 24 | ARG AWS_LAMBDA_RIE_URL_x86_64="unknown" 25 | ARG AWS_LAMBDA_RIE_SIG_x86_64="unknown" 26 | 27 | RUN mkdir -p /usr/local/bin \ 28 | && cd /usr/local/bin \ 29 | && arch=`uname -m` \ 30 | && url="AWS_LAMBDA_RIE_URL_$arch" \ 31 | && sig="AWS_LAMBDA_RIE_SIG_$arch" \ 32 | && echo ">>>> arch $arch" \ 33 | && sh -c "echo '>>>> url ' \${$url}" \ 34 | && sh -c "echo '>>>> sig ' \${$sig}" \ 35 | && sh -c "curl -Lo ./aws-lambda-rie \${$url}" \ 36 | && chmod +x ./aws-lambda-rie \ 37 | && sh -c "echo 'SHA256 (aws-lambda-rie) =' \${$sig}" > ./.sig \ 38 | && shasum -c .sig \ 39 | && rm .sig 40 | 41 | 42 | ## The setup... 43 | ENV PATH=/app/bin:/deps/bin:/deps/local/bin:/stack/bin:/stack/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 44 | WORKDIR /app 45 | ENTRYPOINT [ "/usr/bin/pdi-entrypoint" ] 46 | 47 | 48 | ## The Build version 49 | FROM runtime-base AS build-base 50 | 51 | RUN apt update \ 52 | && apt install -y --no-install-recommends \ 53 | build-essential zlib1g-dev libssl-dev libexpat1-dev libxml2-dev \ 54 | && apt upgrade -y \ 55 | && apt purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ 56 | && rm -fr /var/cache/apt/* /var/lib/apt/lists/* /var/cache/debconf/* 57 | 58 | 59 | ## Our files 60 | FROM scratch AS project 61 | 62 | COPY bin/lambda-bootstrap /var/runtime/bootstrap 63 | COPY layers/ cpanfile* /deps/layers/ 64 | COPY scripts/ /usr/bin/ 65 | 66 | 67 | ## Final Versions: Development 68 | FROM build-base AS devel 69 | COPY --from=project / / 70 | 71 | RUN pdi-build-deps --layer=devel \ 72 | && echo 'eval $( pdi-perl-env )' > /etc/profile.d/perl_env.sh 73 | 74 | 75 | ## Final Versions: Build 76 | FROM build-base AS build 77 | COPY --from=project / / 78 | 79 | 80 | ## Final Versions: Runtime 81 | FROM runtime-base AS runtime 82 | COPY --from=project / / 83 | 84 | 85 | ## Final Versions: Repl 86 | FROM devel AS reply 87 | RUN /usr/local/bin/cpm install --no-test Reply && rm -rf /root/.perl-cpm 88 | 89 | CMD ["reply"] 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Perl Docker Image System # 2 | 3 | ![Docker Pulls](https://img.shields.io/docker/pulls/melopt/perl-alt.svg) 4 | ![Docker Build Status](https://img.shields.io/github/issues/melo/docker-perl-alt.svg) 5 | 6 | This set of images provides a full and extensible setup to run your Perl 7 | applications with Docker. 8 | 9 | There are three main versions of the image: 10 | 11 | * a `-runtime` version that should be used to run the final 12 | applications - the final target of your `Dockerfile` should 13 | use this one; 14 | * a `-build` version that can be used to build your applications; 15 | * a `-devel` version that can be used to debug and develop 16 | applications: this is mostly the `-build` version with extra modules. 17 | 18 | Each of these is available in combination with an Alpine, the official Perl base image, 19 | and the `wolfi-base` from the [Chainguard](https://www.chainguard.dev) project. 20 | 21 | | Base Image | Development | Build | Runtime | 22 | |-------------|-------------|-------|---------| 23 | | `alpine:3.20` | `alpine-latest-devel` / `alpine-3.20-devel` | `alpine-latest-build` / `alpine-3.20-build`| `alpine-latest-runtime` / `alpine-3.20-runtime` | 24 | | `alpine:edge` | `alpine-next-devel` / `alpine-edge-devel` | `alpine-next-build` / `alpine-edge-build` | `alpine-next-runtime` / `alpine-edge-runtime` | 25 | | `perl:5.40-slim` | `perl-latest-devel` / `perl-5.40-slim-devel` | `perl-latest-build` / `perl-5.40-slim-build` | `perl-latest-runtime` / `perl-5.40-slim-runtime` | 26 | | `perl:5.40` | `perl-full-devel` / `perl-5.40-devel` | `perl-full-build` / `perl-5.40-build` | `perl-full-runtime` / `perl-5.40-runtime` | 27 | | `cgr.dev/chainguard/wolfi-base` | `chainguard-latest-devel` | `chainguard-latest-build` | `chainguard-latest-runtime` | 28 | 29 | See below how to create a Dockerfile for your project that makes 30 | full use of this setup, while making sure that you'll end up with the 31 | smallest possible final image. 32 | 33 | 34 | ## What's inside? ## 35 | 36 | All images are based on Alpine and Perl images and include: 37 | 38 | * [perl](https://metacpan.org/release/perl): 39 | * on Alpine images, we use the system `perl`: 40 | * 3.20: perl 5.38.2; 41 | * edge: perl 5.40.0. 42 | * on official Perl images, currently 5.40.0; 43 | * on Chainguard images, currently 5.40.0. 44 | * [cpanm](https://metacpan.org/release/App-cpanminus); 45 | * [Carton](https://metacpan.org/release/Carton); 46 | * [App::cpm](https://metacpan.org/release/App-cpm). 47 | 48 | Some common libs and tools are also included: 49 | 50 | * `openssl`: this is not the default for Alpine, but a lot of software 51 | fails to build without it; 52 | * `zlib`; 53 | * `expat`; 54 | * `libxml2` and `libxml-utils`; 55 | * `jq`. 56 | 57 | The `-build` and `-devel` versions include the development 58 | versions of these libraries. 59 | 60 | 61 | ### Lambda Support (Experimental) ### 62 | 63 | The Lambda support is still experimental. It seems to work fine but we 64 | are not using it in production at this moment. 65 | 66 | The support includes testing your functions locally using the 67 | [AWS Lambda Runtime Interface Emulator][AWS-RIE]. 68 | 69 | Most of the Lambda logic is provided by the excellent [AWS::Lambda][] 70 | Perl module. Kudos to Shogo Ichinose for this. 71 | 72 | Your handlers should be placed in the `lambda-handlers/` of your 73 | project. Make sure your `.pl` handlers are executable. 74 | 75 | A sample handler (named `functions.pl`) looks like this: 76 | 77 | ``` 78 | #!perl 79 | 80 | use strict; 81 | use warnings; 82 | use JSON::MaybeXS; 83 | 84 | sub echo { 85 | my ($payload, $context) = @_; 86 | 87 | return encode_json({ payload => $payload, context => { %$context } }); 88 | } 89 | 90 | 1; 91 | ``` 92 | 93 | The name of this function is `functions.echo`. The first part, 94 | `functions`, is the name of the handler file, `functions.pl`. The second 95 | part, `echo`, is the name of the sub called in that file. See 96 | [AWS::Lambda][] for details on writing Lambda handlers. 97 | 98 | To test the function locally, build your image then run it like this: 99 | 100 | ``` 101 | $ docker run --rm -it -p 9000:8080 your_image your_handler.your_function 102 | 10 Dec 2022 16:31:26,839 [INFO] (rapid) exec '/var/runtime/bootstrap' (cwd=/app, handler=your_handler.your_function) 103 | 10 Dec 2022 16:31:36,015 [INFO] (rapid) extensionsDisabledByLayer(/opt/disable-extensions-jwigqn8j) -> stat /opt/disable-extensions-jwigqn8j: no such file or directory 104 | 10 Dec 2022 16:31:36,015 [WARNING] (rapid) Cannot list external agents error=open /opt/extensions: no such file or directory 105 | ``` 106 | 107 | You can then test with: 108 | ``` 109 | $ curl -XPOST 'http://localhost:9000/2015-03-31/functions/function/invocations' -d '{}' 110 | ``` 111 | 112 | The logs will show something like this: 113 | 114 | ``` 115 | START RequestId: 3503ccbd-0dfc-4eba-99f7-5aa72b58692b Version: $LATEST 116 | END RequestId: 3503ccbd-0dfc-4eba-99f7-5aa72b58692b 117 | REPORT RequestId: 3503ccbd-0dfc-4eba-99f7-5aa72b58692b Init Duration: 0.36 ms Duration: 63.70 ms Billed Duration: 64 ms Memory Size: 3008 MB Max Memory Used: 3008 MB 118 | ``` 119 | 120 | For a fully working example see [test/lambda][lambda-test] inside this repository. 121 | 122 | 123 | ## Entrypoint ## 124 | 125 | The system includes a standard ENTRYPOINT script that sets a decent 126 | `PERL5LIB` based on the assumption that your app libs are under 127 | `/app/lib`. 128 | 129 | It will also check for submodules under `/app/elib/` and include 130 | all `/app/elib/*/lib` folders in `PERL5LIB`. 131 | 132 | Finally, if you need your own ENTRYPOINT script, place an executable 133 | at `/entrypoint` and it will be executed before the `COMMAND`. 134 | 135 | 136 | ## Rational ## 137 | 138 | The system was designed to have a big, fully featured, build-time image, 139 | and another slim runtime image. A third version that you can use during 140 | development time can also be created with a small addition to your 141 | app `Dockerfile`. 142 | 143 | With a Docker multi-stage build, you can use a single Dockerfile to 144 | build and generate all the images, including the final runtime image. 145 | 146 | The system assumes a specific directory layout for the app, the app 147 | dependencies, and the "stack". 148 | 149 | * application is inside `/app`; 150 | * application dependencies will be installed at `/deps`; 151 | * stack code and dependencies will be installed at `/stack`; 152 | 153 | The fact that the stack code and dependencies are placed outside the app 154 | locations allow you to create Docker images with just the stack 155 | components that you can reuse between multiple projects. See below for 156 | two sample stacks, one for a Dancer2+Xslate+Starman combo, and another 157 | to have all the things needed to run a Minion job system. 158 | 159 | The reason to split your app dependencies and your code is to 160 | allow you to use an image with your work directory from your laptop 161 | mounted under `/app`. If the app dependencies are in `/deps` and only 162 | your code is under `/apps` you can start a container with an image 163 | created from your app Dockerfile, and mount the laptop work directory 164 | with `docker run` `-v`-option under `/app` and develop with the same 165 | environment as your deployment environment will look like. 166 | 167 | 168 | # How to use # 169 | 170 | Below you'll find the recommended Dockerfile. The goal is to get a fast 171 | build, making use as much as possible of the Docker build cache, and 172 | provide the smallest possible image in the end. 173 | 174 | This is an ordinary application. Dependencies are tracked with 175 | [Carton](https://metacpan.org/pod/Carton) in a `cpanfile` with the 176 | associate `cpanfile.snapshot`. 177 | 178 | You should be able to just copy&paste this sample `Dockerfile` to your 179 | app work directory, and tweak the `apk add` lines to make sure that 180 | you add any packaged dependencies you might need. If you don't need 181 | any package dependencies, you can just remove those lines altogether. 182 | 183 | ```Dockerfile 184 | ### First stage, just to add our package dependencies. We put this on a 185 | ### separate stage to be able to reuse them across the "build" and 186 | ### "devel" phases lower down 187 | FROM melopt/perl-alt:alpine-latest-build AS package_deps 188 | 189 | ### Add any packaged dependencies that your application might need. Make 190 | ### sure you use the -devel or -libs package, as this is to be used to 191 | ### build your dependencies and app. The postgres-libs shown below is 192 | ### just an example 193 | RUN apk --no-cache add postgres-libs 194 | 195 | 196 | ### Second stage, build our app. We start from the previous stage, package_deps 197 | FROM package_deps AS builder 198 | 199 | ### We copy all cpanfiles (this includes the optional cpanfile.snapshot) 200 | ### to the application directory, and we install the dependencies. Note 201 | ### that by default pdi-build-deps will install our apps dependencies 202 | ### under /deps. This is important later on. 203 | COPY cpanfile* /app/ 204 | RUN cd /app && pdi-build-deps 205 | 206 | ### Copy the rest of the application to the app folder 207 | COPY . /app/ 208 | 209 | 210 | ### The third stage is used to create a developers image, based on the 211 | ### package_deps and build phases, and with 212 | ### possible some extra tools that you might want during local 213 | ### development. This layer has no impact on the runtime final version, 214 | ### but can be generated with a `docker build --target devel` 215 | FROM package_deps AS devel 216 | 217 | ### Add any packaged dependencies that your application might need 218 | ### during development time. Given that we start from package_deps 219 | ### phase, all package dependencies from the build phase are already 220 | ### included. 221 | RUN apk --no-cache add jq 222 | 223 | ### Assuming you have a cpanfile.devel file with all your devel-time 224 | ### dependencies, you can install it with this 225 | RUN cd /app && pdi-build-deps cpanfile.devel 226 | 227 | ### Copy the App dependencies and the app code 228 | COPY --from=builder /deps/ /deps/ 229 | COPY --from=builder /app/ /app/ 230 | 231 | ### And we are done: this "development" image can be generated with: 232 | ### 233 | ### docker build -t my-app-devel --target devel . 234 | ### 235 | ### You can then run it as: 236 | ### 237 | ### cd your-app-workdir; docker run -it --rm -v `pwd`:/app my-app-devel 238 | ### 239 | 240 | 241 | ### Now for the fourth and final stage, the runtime edition. We start from the 242 | ### runtime version and add all the files from the build phase 243 | FROM melopt/perl-alt:alpine-latest-runtime 244 | 245 | ### Add any packaged dependencies that your application might need 246 | RUN apk --no-cache add postgres-libs 247 | 248 | ### Copy the App dependencies and the app code 249 | COPY --from=builder /deps/ /deps/ 250 | COPY --from=builder /app/ /app/ 251 | 252 | ### Add the command to start the application 253 | CMD [ "your_app_start_command.pl" ] 254 | ``` 255 | 256 | ## Reuseable Stacks ## 257 | 258 | You can also make stacks with commonly used combinations of packages. 259 | The setup is almost the same, the only difference is that when 260 | installing the dependencies and any other software you might need, the 261 | destination directory is `/stack`. The `-runtime` image will 262 | automatically include all of `/stack` dependencies and libs into 263 | `PERL5LIB`, and it will also make sure that any commands that are placed 264 | on `bin/` directories are included on our `PATH`. 265 | 266 | 267 | ### Dancer2 + Text::Xslate + Starman ### 268 | 269 | Below you'll find an example of a Dockerfile for a stack that provides you: 270 | 271 | * Dancer2; 272 | * Text::Xslate for templating; 273 | * Starman for a web server. 274 | 275 | This is actually available at [melopt/dancer2-xslate-starman](https://hub.docker.com/r/melopt/dancer2-xslate-starman) (repository is at [Github melo/docker-dancer2-xslate-starman](https://www.github.com/melo/docker-dancer2-xslate-starman)). You can check the [`cpanfile` used for the stack](https://github.com/melo/docker-dancer2-xslate-starman/blob/master/cpanfile). 276 | 277 | ```Dockerfile 278 | FROM melopt/perl-alt:alpine-latest-build AS builder 279 | 280 | COPY cpanfile* /stack/ 281 | RUN cd /stack && pdi-build-deps --stack 282 | 283 | 284 | FROM melopt/perl-alt:alpine-latest-runtime 285 | 286 | COPY --from=builder /stack /stack/ 287 | ``` 288 | 289 | Some notes about this `Dockerfile`: 290 | 291 | * notice that the `pdi-build-deps` is run with the `--stack` option; 292 | * for the runtime version, we copy the `/stack` folders. 293 | 294 | With this setup, you'll end up with a Docker image for your stack that you can reuse with multiple projects. For example, a simple Dancer2+Xslate-based web app could have a `Dockerfile` like this: 295 | 296 | ```Dockerfile 297 | ### Package deps, for build and devel phases 298 | FROM melopt/perl-alt:latest-build AS package_deps 299 | 300 | RUN apk --no-cache add mariadb-dev 301 | 302 | ### Build phase, build our app and our app deps 303 | FROM package_deps AS builder 304 | 305 | COPY cpanfile* /app/ 306 | RUN cd /app && pdi-build-deps 307 | 308 | COPY . /app/ 309 | 310 | 311 | ### Create the "development" image 312 | FROM package_deps AS devel 313 | 314 | RUN apk --no-cache add jq 315 | RUN cd /app && pdi-build-deps cpanfile.devel 316 | 317 | COPY --from=builder /deps/ /deps/ 318 | COPY --from=builder /app/ /app/ 319 | 320 | 321 | ### Final phase: the runtime version - notice that we start from the stack image 322 | FROM melopt/dancer2-xslate-starman 323 | 324 | ENV PLACK_ENV=production 325 | RUN apk --no-cache add mariadb-client 326 | 327 | COPY --from=builder /deps/ /deps/ 328 | COPY --from=builder /app/ /app/ 329 | 330 | CMD [ "plackup", "--port", "80", "--server", "Starman" ] 331 | ``` 332 | 333 | ### Minion ### 334 | 335 | Another stack, this time to allow users to run Minion workers and the admin interface. You can find the image at [melopt/minion](https://hub.docker.com/r/melopt/minion) (repository at [Github melo/docker-minion](https://github.com/melo/docker-minion)). 336 | 337 | ```Dockerfile 338 | ### Prepare the dependencies 339 | FROM melopt/perl-alt:alpine-latest-build AS builder 340 | 341 | RUN apk --no-cache add mariadb-dev postgresql-dev 342 | 343 | COPY cpanfile* /stack/ 344 | RUN cd /stack && pdi-build-deps --stack 345 | 346 | ### This stack includes some helper scripts 347 | COPY bin /stack/bin/ 348 | ### small "test phase", just to catch stupid mistakes... 349 | RUN set -e && cd /stack && for script in bin/* ; do perl -wc $script ; done 350 | 351 | 352 | ### Runtime image 353 | FROM melopt/perl-alt:alpine-latest-runtime 354 | 355 | RUN apk --no-cache add mariadb-client postgresql-libs 356 | 357 | COPY --from=builder /stack /stack 358 | 359 | ENTRYPOINT [ "/stack/bin/minion-entrypoint" ] 360 | ``` 361 | 362 | 363 | # Repository # 364 | 365 | This image source repository is at [https://github.com/melo/docker-perl-alt][repo]. 366 | 367 | 368 | # Author # 369 | 370 | Pedro Melo [melo@simplicidade.org](mailto:melo@simplicidade.org) 371 | 372 | [repo]: https://github.com/melo/docker-perl-alt 373 | [AWS-RIE]: https://github.com/aws/aws-lambda-runtime-interface-emulator 374 | [AWS::Lambda]: https://metacpan.org/pod/AWS::Lambda 375 | [lambda-test]: https://github.com/melo/docker-perl-alt/tree/master/test/lambda 376 | -------------------------------------------------------------------------------- /bin/lambda-bootstrap: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use strict; 4 | use warnings; 5 | use utf8; 6 | use AWS::Lambda::Bootstrap; 7 | 8 | bootstrap(@ARGV); 9 | -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use strict; 4 | use warnings; 5 | use Scalar::Util (); 6 | use autodie; 7 | use Getopt::Long; 8 | use Path::Tiny; 9 | use Digest::SHA; 10 | 11 | sub usage { 12 | die "Usage: $0 [--push] [--filter=s] [--check]\n"; 13 | } 14 | 15 | my %cfg = (repo => 'melopt/perl-alt'); 16 | GetOptions(\%cfg, 'help|?', 'push', 'filter=s', 'repo=s', 'multiplatform', 'check', 'debug') or usage(); 17 | usage() if $cfg{help}; 18 | 19 | my $repo = $cfg{repo}; 20 | 21 | my @versions = ( 22 | ['perl', 'latest', '5.40-slim', 1], 23 | ['perl', 'full', '5.40'], 24 | ['alpine', 'latest', '3.20'], 25 | ['alpine', 'next', 'edge'], 26 | ['alpine', 'edge', 'edge'], 27 | ['chainguard', 'latest', 'latest', undef, 'cgr.dev/chainguard/wolfi-base'], 28 | ); 29 | 30 | ## Lambda 31 | my %lambda_runtime_versions = ( 32 | aarch64 => [ 33 | 'https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/download/v1.22/aws-lambda-rie-arm64', 34 | '15ae5356c8e76cc483007c7cfe1aa821cae10afd259eab82ad8b7102ff486fdf', 35 | ], 36 | x86_64 => [ 37 | 'https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/download/v1.22/aws-lambda-rie-x86_64', 38 | '9badeae7e0ed0667afa60f79fd250002dfae38104f23ebc80508e247616ac97a', 39 | ], 40 | ); 41 | if ($cfg{check}) { 42 | for my $arch (sort keys %lambda_runtime_versions) { 43 | my ($url, $wanted) = $lambda_runtime_versions{$arch}->@*; 44 | 45 | my $tmp = Path::Tiny->tempfile; 46 | system('/usr/bin/curl', '-sLo', $tmp, $url); 47 | 48 | my $d = Digest::SHA->new(256); 49 | $d->addfile($tmp->stringify); 50 | my $got = $d->hexdigest; 51 | 52 | my $status = $wanted eq $got ? 'ok' : 'out-of-date'; 53 | print "$status: $arch $url\n\twanted $wanted\n\tactual $got\n\tfile $tmp"; 54 | } 55 | exit(0); 56 | } 57 | 58 | ## Multiplatform support 59 | my @plats; 60 | my $docker_cmd = 'docker'; 61 | if ($cfg{multiplatform}) { 62 | $docker_cmd = 'nerdctl'; 63 | push @plats, '--platform', 'linux/arm64,linux/amd64'; 64 | print ">>>>>>>>>>> MULTIPLATFORM Build detected: @plats\n"; 65 | sleep(5); 66 | } 67 | 68 | for my $spec (@versions) { 69 | my ($f, $t, $v, $x, $bi) = @$spec; 70 | $bi = $f unless $bi; 71 | 72 | my $baset = "$repo:$f-$t"; 73 | my $basev = "$repo:$f-$v"; 74 | 75 | 76 | my @tags; 77 | for my $target (qw( devel build runtime reply )) { 78 | my $tagt = "$baset-$target"; 79 | my $tagv = "$basev-$target"; 80 | my $tagx = $x ? "$target" : ""; 81 | my $tagl = $x && $target eq 'runtime' ? "latest" : ""; 82 | 83 | if ($cfg{filter} and $tagt !~ m/$cfg{filter}/) { 84 | print ">>>>>>>> Skipped via filter '$cfg{filter}'\n"; 85 | next; 86 | } 87 | 88 | print ">>>> target $target, base $v: $tagt\n"; 89 | print ">>>> target $target, base $v: $tagv\n"; 90 | print ">>>> also tagged: $tagx\n" if $tagx; 91 | print ">>>> also tagged: $tagl\n" if $tagl; 92 | print "\n"; 93 | 94 | my @itags = ($tagt, $tagv); 95 | push @itags, $tagx if $tagx; 96 | push @itags, $tagl if $tagl; 97 | push @itags, $baset if $target eq "devel"; 98 | 99 | my @cmd = ($docker_cmd, 'build'); 100 | push @cmd, '--progress', 'plain' if $cfg{debug}; 101 | push @cmd, @plats if @plats; 102 | push @cmd, '--target' => $target; 103 | push @cmd, '--file' => "Dockerfile.$f"; 104 | push @cmd, map { ('--tag', $_) } @itags; 105 | push @cmd, '--label' => 'maintainer=Pedro Melo '; 106 | push @cmd, 107 | '--build-arg' => "BASE=$bi:$v", 108 | '--build-arg' => "AWS_LAMBDA_RIE_URL_aarch64=$lambda_runtime_versions{aarch64}[0]", 109 | '--build-arg' => "AWS_LAMBDA_RIE_SIG_aarch64=$lambda_runtime_versions{aarch64}[1]", 110 | '--build-arg' => "AWS_LAMBDA_RIE_URL_x86_64=$lambda_runtime_versions{x86_64}[0]", 111 | '--build-arg' => "AWS_LAMBDA_RIE_SIG_x86_64=$lambda_runtime_versions{x86_64}[1]"; 112 | push @cmd, '.'; 113 | 114 | my $err = my_system(@cmd); 115 | die "FATAL: failed to build Docker image for target $target, base $v: $tagt\n" if $err; 116 | 117 | push @tags, @itags; 118 | 119 | if ($cfg{push}) { 120 | my_system($docker_cmd, 'push', @plats, $_) for @tags; 121 | @tags = (); 122 | } 123 | } 124 | } 125 | 126 | 127 | print "\n\n>>> DONE\n\n"; 128 | 129 | sub my_system { 130 | print "\n\n>>>>>>>> Cmd: @_\n\n"; 131 | return system(@_); 132 | } 133 | -------------------------------------------------------------------------------- /layers/devel/cpanfile: -------------------------------------------------------------------------------- 1 | requires 'Code::TidyAll::Plugin::Perl::AlignMooseAttributes'; 2 | requires 'Code::TidyAll::Plugin::Perl::IgnoreMethodSignaturesSimple'; 3 | requires 'Code::TidyAll::Plugin::PerlTidy'; 4 | requires 'Code::TidyAll::Plugin::PodTidy'; 5 | requires 'Code::TidyAll::Plugin::SortLines'; 6 | requires 'Code::TidyAll'; 7 | requires 'Perl::LanguageServer', '2.0'; 8 | requires 'Perl::Tidy'; 9 | requires 'Pod::Tidy'; 10 | requires 'Reply', '0.42'; 11 | requires 'Test::Code::TidyAll'; 12 | requires 'Test::Compile'; 13 | requires 'Test::Deep', '1.130'; 14 | requires 'Test::Fatal', '0.016'; 15 | requires 'Test::More', '0.98'; 16 | requires 'Test::More', '0.98'; 17 | requires 'Test::Pod::Coverage'; 18 | requires 'Test::Pod'; 19 | requires 'Test::Simple', '1.302067'; 20 | requires 'Test2::Suite', '0.000138'; 21 | -------------------------------------------------------------------------------- /layers/devel/cpanfile.snapshot: -------------------------------------------------------------------------------- 1 | # carton snapshot format: version 1.0 2 | DISTRIBUTIONS 3 | Algorithm-Diff-1.200 4 | pathname: R/RJ/RJBS/Algorithm-Diff-1.200.tar.gz 5 | provides: 6 | Algorithm::Diff 1.200 7 | Algorithm::Diff::_impl 1.200 8 | requirements: 9 | ExtUtils::MakeMaker 0 10 | AnyEvent-7.17 11 | pathname: M/ML/MLEHMANN/AnyEvent-7.17.tar.gz 12 | provides: 13 | AE undef 14 | AE::Log::COLLECT undef 15 | AE::Log::FILTER undef 16 | AE::Log::LOG undef 17 | AnyEvent 7.17 18 | AnyEvent::Base 7.17 19 | AnyEvent::CondVar 7.17 20 | AnyEvent::CondVar::Base 7.17 21 | AnyEvent::DNS undef 22 | AnyEvent::Debug undef 23 | AnyEvent::Debug::Backtrace undef 24 | AnyEvent::Debug::Wrap undef 25 | AnyEvent::Debug::Wrapped undef 26 | AnyEvent::Debug::shell undef 27 | AnyEvent::Handle undef 28 | AnyEvent::IO undef 29 | AnyEvent::IO::IOAIO undef 30 | AnyEvent::IO::Perl undef 31 | AnyEvent::Impl::Cocoa undef 32 | AnyEvent::Impl::EV undef 33 | AnyEvent::Impl::Event undef 34 | AnyEvent::Impl::EventLib undef 35 | AnyEvent::Impl::FLTK undef 36 | AnyEvent::Impl::Glib undef 37 | AnyEvent::Impl::IOAsync undef 38 | AnyEvent::Impl::Irssi undef 39 | AnyEvent::Impl::POE undef 40 | AnyEvent::Impl::Perl undef 41 | AnyEvent::Impl::Qt undef 42 | AnyEvent::Impl::Qt::Io undef 43 | AnyEvent::Impl::Qt::Timer undef 44 | AnyEvent::Impl::Tk undef 45 | AnyEvent::Impl::UV undef 46 | AnyEvent::Log undef 47 | AnyEvent::Log::COLLECT undef 48 | AnyEvent::Log::Ctx undef 49 | AnyEvent::Log::FILTER undef 50 | AnyEvent::Log::LOG undef 51 | AnyEvent::Loop undef 52 | AnyEvent::Socket undef 53 | AnyEvent::Strict undef 54 | AnyEvent::TLS undef 55 | AnyEvent::Util undef 56 | requirements: 57 | Canary::Stability 0 58 | ExtUtils::MakeMaker 6.52 59 | AnyEvent-AIO-1.1 60 | pathname: M/ML/MLEHMANN/AnyEvent-AIO-1.1.tar.gz 61 | provides: 62 | AnyEvent::AIO 1.1 63 | requirements: 64 | AnyEvent 3.4 65 | ExtUtils::MakeMaker 0 66 | IO::AIO 3 67 | Canary-Stability-2013 68 | pathname: M/ML/MLEHMANN/Canary-Stability-2013.tar.gz 69 | provides: 70 | Canary::Stability 2013 71 | requirements: 72 | ExtUtils::MakeMaker 0 73 | Capture-Tiny-0.48 74 | pathname: D/DA/DAGOLDEN/Capture-Tiny-0.48.tar.gz 75 | provides: 76 | Capture::Tiny 0.48 77 | requirements: 78 | Carp 0 79 | Exporter 0 80 | ExtUtils::MakeMaker 6.17 81 | File::Spec 0 82 | File::Temp 0 83 | IO::Handle 0 84 | Scalar::Util 0 85 | perl 5.006 86 | strict 0 87 | warnings 0 88 | Class-Inspector-1.36 89 | pathname: P/PL/PLICEASE/Class-Inspector-1.36.tar.gz 90 | provides: 91 | Class::Inspector 1.36 92 | Class::Inspector::Functions 1.36 93 | requirements: 94 | ExtUtils::MakeMaker 0 95 | File::Spec 0.80 96 | base 0 97 | perl 5.008 98 | Class-Load-0.25 99 | pathname: E/ET/ETHER/Class-Load-0.25.tar.gz 100 | provides: 101 | Class::Load 0.25 102 | Class::Load::PP 0.25 103 | requirements: 104 | Carp 0 105 | Data::OptList 0.110 106 | Exporter 0 107 | ExtUtils::MakeMaker 0 108 | Module::Implementation 0.04 109 | Module::Runtime 0.012 110 | Package::Stash 0.14 111 | Scalar::Util 0 112 | Try::Tiny 0 113 | base 0 114 | perl 5.006 115 | strict 0 116 | warnings 0 117 | Class-Load-XS-0.10 118 | pathname: E/ET/ETHER/Class-Load-XS-0.10.tar.gz 119 | provides: 120 | Class::Load::XS 0.10 121 | requirements: 122 | Class::Load 0.20 123 | ExtUtils::MakeMaker 0 124 | XSLoader 0 125 | perl 5.006 126 | strict 0 127 | warnings 0 128 | Class-Method-Modifiers-2.13 129 | pathname: E/ET/ETHER/Class-Method-Modifiers-2.13.tar.gz 130 | provides: 131 | Class::Method::Modifiers 2.13 132 | requirements: 133 | B 0 134 | Carp 0 135 | Exporter 0 136 | ExtUtils::MakeMaker 0 137 | base 0 138 | perl 5.006 139 | strict 0 140 | warnings 0 141 | Class-Refresh-0.07 142 | pathname: D/DO/DOY/Class-Refresh-0.07.tar.gz 143 | provides: 144 | Class::Refresh 0.07 145 | requirements: 146 | B 0 147 | Carp 0 148 | Class::Load 0 149 | Class::Unload 0 150 | Devel::OverrideGlobalRequire 0 151 | ExtUtils::MakeMaker 6.30 152 | Try::Tiny 0 153 | strict 0 154 | warnings 0 155 | Class-Unload-0.11 156 | pathname: I/IL/ILMARI/Class-Unload-0.11.tar.gz 157 | provides: 158 | Class::Unload 0.11 159 | requirements: 160 | Class::Inspector 0 161 | ExtUtils::MakeMaker 0 162 | strict 0 163 | warnings 0 164 | Code-TidyAll-0.78 165 | pathname: D/DR/DROLSKY/Code-TidyAll-0.78.tar.gz 166 | provides: 167 | Code::TidyAll 0.78 168 | Code::TidyAll::Cache 0.78 169 | Code::TidyAll::CacheModel 0.78 170 | Code::TidyAll::CacheModel::Shared 0.78 171 | Code::TidyAll::Config::INI::Reader 0.78 172 | Code::TidyAll::Git::Precommit 0.78 173 | Code::TidyAll::Git::Prereceive 0.78 174 | Code::TidyAll::Git::Util 0.78 175 | Code::TidyAll::Plugin 0.78 176 | Code::TidyAll::Plugin::CSSUnminifier 0.78 177 | Code::TidyAll::Plugin::GenericTransformer 0.78 178 | Code::TidyAll::Plugin::GenericValidator 0.78 179 | Code::TidyAll::Plugin::JSBeautify 0.78 180 | Code::TidyAll::Plugin::JSHint 0.78 181 | Code::TidyAll::Plugin::JSLint 0.78 182 | Code::TidyAll::Plugin::JSON 0.78 183 | Code::TidyAll::Plugin::MasonTidy 0.78 184 | Code::TidyAll::Plugin::PHPCodeSniffer 0.78 185 | Code::TidyAll::Plugin::PerlCritic 0.78 186 | Code::TidyAll::Plugin::PerlTidy 0.78 187 | Code::TidyAll::Plugin::PerlTidySweet 0.78 188 | Code::TidyAll::Plugin::PodChecker 0.78 189 | Code::TidyAll::Plugin::PodSpell 0.78 190 | Code::TidyAll::Plugin::PodTidy 0.78 191 | Code::TidyAll::Plugin::SortLines 0.78 192 | Code::TidyAll::Result 0.78 193 | Code::TidyAll::Role::GenericExecutable 0.78 194 | Code::TidyAll::Role::HasIgnore 0.78 195 | Code::TidyAll::Role::RunsCommand 0.78 196 | Code::TidyAll::Role::Tempdir 0.78 197 | Code::TidyAll::SVN::Precommit 0.78 198 | Code::TidyAll::SVN::Util 0.78 199 | Code::TidyAll::Util::Zglob 0.78 200 | Code::TidyAll::Zglob 0.78 201 | Test::Code::TidyAll 0.78 202 | requirements: 203 | Capture::Tiny 0 204 | Config::INI::Reader 0 205 | Cwd 0 206 | Data::Dumper 0 207 | Date::Format 0 208 | Digest::SHA 0 209 | Exporter 0 210 | ExtUtils::MakeMaker 0 211 | File::Basename 0 212 | File::Find 0 213 | File::Spec 0 214 | File::Which 0 215 | File::pushd 0 216 | Getopt::Long 0 217 | IPC::Run3 0 218 | IPC::System::Simple 0 219 | List::Compare 0 220 | List::SomeUtils 0 221 | Log::Any 0 222 | Module::Runtime 0 223 | Moo 2.000000 224 | Moo::Role 0 225 | Path::Tiny 0.098 226 | Scalar::Util 0 227 | Scope::Guard 0 228 | Specio 0.40 229 | Specio::Declare 0 230 | Specio::Library::Builtins 0 231 | Specio::Library::Numeric 0 232 | Specio::Library::Path::Tiny 0.04 233 | Specio::Library::String 0 234 | Test::Builder 0 235 | Text::Diff 1.44 236 | Text::Diff::Table 0 237 | Text::ParseWords 0 238 | Time::Duration::Parse 0 239 | Try::Tiny 0 240 | base 0 241 | constant 0 242 | perl 5.008008 243 | strict 0 244 | warnings 0 245 | Code-TidyAll-Plugin-Perl-AlignMooseAttributes-0.01 246 | pathname: J/JS/JSWARTZ/Code-TidyAll-Plugin-Perl-AlignMooseAttributes-0.01.tar.gz 247 | provides: 248 | Code::TidyAll::Plugin::Perl::AlignMooseAttributes 0.01 249 | requirements: 250 | Code::TidyAll 0.04 251 | ExtUtils::MakeMaker 6.30 252 | List::Util 0 253 | Test::More 0 254 | Text::Aligner 0 255 | Code-TidyAll-Plugin-Perl-IgnoreMethodSignaturesSimple-0.03 256 | pathname: J/JS/JSWARTZ/Code-TidyAll-Plugin-Perl-IgnoreMethodSignaturesSimple-0.03.tar.gz 257 | provides: 258 | Code::TidyAll::Plugin::Perl::IgnoreMethodSignaturesSimple 0.03 259 | requirements: 260 | Code::TidyAll 0.04 261 | ExtUtils::MakeMaker 0 262 | Compiler-Lexer-0.23 263 | pathname: G/GO/GOCCY/Compiler-Lexer-0.23.tar.gz 264 | provides: 265 | Compiler::Lexer 0.23 266 | Compiler::Lexer::Kind undef 267 | Compiler::Lexer::SyntaxType undef 268 | Compiler::Lexer::Token undef 269 | Compiler::Lexer::TokenType undef 270 | requirements: 271 | Devel::PPPort 3.19 272 | ExtUtils::CBuilder 0 273 | ExtUtils::MakeMaker 6.59 274 | ExtUtils::ParseXS 2.21 275 | Module::Build 0.4005 276 | Module::Build::XSUtil 0.19 277 | Test::More 0 278 | XSLoader 0.02 279 | perl 5.008001 280 | Config-INI-0.025 281 | pathname: R/RJ/RJBS/Config-INI-0.025.tar.gz 282 | provides: 283 | Config::INI 0.025 284 | Config::INI::Reader 0.025 285 | Config::INI::Writer 0.025 286 | requirements: 287 | Carp 0 288 | ExtUtils::MakeMaker 0 289 | Mixin::Linewise::Readers 0.105 290 | Mixin::Linewise::Writers 0 291 | strict 0 292 | warnings 0 293 | Config-INI-Reader-Ordered-0.020 294 | pathname: R/RJ/RJBS/Config-INI-Reader-Ordered-0.020.tar.gz 295 | provides: 296 | Config::INI::Reader::Ordered 0.020 297 | requirements: 298 | Config::INI::Reader 0 299 | ExtUtils::MakeMaker 0 300 | strict 0 301 | vars 0 302 | Coro-6.57 303 | pathname: M/ML/MLEHMANN/Coro-6.57.tar.gz 304 | provides: 305 | Coro 6.57 306 | Coro::AIO 6.57 307 | Coro::AnyEvent 6.57 308 | Coro::BDB 6.57 309 | Coro::Channel 6.57 310 | Coro::Debug 6.57 311 | Coro::EV 6.57 312 | Coro::Event 6.57 313 | Coro::Handle 6.57 314 | Coro::Handle::FH 6.57 315 | Coro::LWP 6.57 316 | Coro::LWP::Socket 6.57 317 | Coro::MakeMaker 6.57 318 | Coro::RWLock 6.57 319 | Coro::Select 6.57 320 | Coro::Semaphore 6.57 321 | Coro::SemaphoreSet 6.57 322 | Coro::Signal 6.57 323 | Coro::Socket 6.57 324 | Coro::Specific 6.57 325 | Coro::State 6.57 326 | Coro::Storable 6.57 327 | Coro::Timer 6.57 328 | Coro::Timer::Timeout 6.57 329 | Coro::Util 6.57 330 | requirements: 331 | AnyEvent 5 332 | Canary::Stability 0 333 | ExtUtils::MakeMaker 6.52 334 | Guard 0.5 335 | Scalar::Util 0 336 | Storable 2.15 337 | common::sense 0 338 | Data-Dump-1.23 339 | pathname: G/GA/GAAS/Data-Dump-1.23.tar.gz 340 | provides: 341 | Data::Dump 1.23 342 | Data::Dump::FilterContext undef 343 | Data::Dump::Filtered undef 344 | Data::Dump::Trace 0.02 345 | Data::Dump::Trace::Call 0.02 346 | Data::Dump::Trace::Wrapper 0.02 347 | requirements: 348 | ExtUtils::MakeMaker 0 349 | Symbol 0 350 | Test 0 351 | perl 5.006 352 | Data-OptList-0.110 353 | pathname: R/RJ/RJBS/Data-OptList-0.110.tar.gz 354 | provides: 355 | Data::OptList 0.110 356 | requirements: 357 | ExtUtils::MakeMaker 0 358 | List::Util 0 359 | Params::Util 0 360 | Sub::Install 0.921 361 | strict 0 362 | warnings 0 363 | Devel-Caller-2.06 364 | pathname: R/RC/RCLAMP/Devel-Caller-2.06.tar.gz 365 | provides: 366 | Devel::Caller 2.06 367 | requirements: 368 | ExtUtils::MakeMaker 0 369 | PadWalker 0.08 370 | Test::More 0 371 | Devel-CheckCompiler-0.07 372 | pathname: S/SY/SYOHEX/Devel-CheckCompiler-0.07.tar.gz 373 | provides: 374 | Devel::AssertC99 undef 375 | Devel::CheckCompiler 0.07 376 | requirements: 377 | Exporter 0 378 | ExtUtils::CBuilder 0 379 | File::Temp 0 380 | Module::Build::Tiny 0.035 381 | Test::More 0.98 382 | parent 0 383 | perl 5.008001 384 | Devel-GlobalDestruction-0.14 385 | pathname: H/HA/HAARG/Devel-GlobalDestruction-0.14.tar.gz 386 | provides: 387 | Devel::GlobalDestruction 0.14 388 | requirements: 389 | ExtUtils::MakeMaker 0 390 | Sub::Exporter::Progressive 0.001011 391 | perl 5.006 392 | Devel-LexAlias-0.05 393 | pathname: R/RC/RCLAMP/Devel-LexAlias-0.05.tar.gz 394 | provides: 395 | Devel::LexAlias 0.05 396 | requirements: 397 | Devel::Caller 0.03 398 | ExtUtils::MakeMaker 0 399 | Test::More 0 400 | Devel-OverloadInfo-0.005 401 | pathname: I/IL/ILMARI/Devel-OverloadInfo-0.005.tar.gz 402 | provides: 403 | Devel::OverloadInfo 0.005 404 | requirements: 405 | Exporter 5.57 406 | ExtUtils::MakeMaker 0 407 | MRO::Compat 0 408 | Package::Stash 0.14 409 | Scalar::Util 0 410 | Sub::Identify 0 411 | overload 0 412 | perl 5.006 413 | strict 0 414 | warnings 0 415 | Devel-OverrideGlobalRequire-0.001 416 | pathname: D/DA/DAGOLDEN/Devel-OverrideGlobalRequire-0.001.tar.gz 417 | provides: 418 | Devel::OverrideGlobalRequire 0.001 419 | requirements: 420 | ExtUtils::MakeMaker 6.30 421 | File::Find 0 422 | File::Spec::Functions 0 423 | File::Temp 0 424 | List::Util 0 425 | Test::More 0 426 | strict 0 427 | warnings 0 428 | Devel-StackTrace-2.04 429 | pathname: D/DR/DROLSKY/Devel-StackTrace-2.04.tar.gz 430 | provides: 431 | Devel::StackTrace 2.04 432 | Devel::StackTrace::Frame 2.04 433 | requirements: 434 | ExtUtils::MakeMaker 0 435 | File::Spec 0 436 | Scalar::Util 0 437 | overload 0 438 | perl 5.006 439 | strict 0 440 | warnings 0 441 | Devel-Symdump-2.18 442 | pathname: A/AN/ANDK/Devel-Symdump-2.18.tar.gz 443 | provides: 444 | Devel::Symdump 2.18 445 | Devel::Symdump::Export undef 446 | requirements: 447 | Compress::Zlib 0 448 | ExtUtils::MakeMaker 0 449 | Test::More 0 450 | perl 5.004 451 | Dist-CheckConflicts-0.11 452 | pathname: D/DO/DOY/Dist-CheckConflicts-0.11.tar.gz 453 | provides: 454 | Dist::CheckConflicts 0.11 455 | requirements: 456 | Carp 0 457 | Exporter 0 458 | ExtUtils::MakeMaker 6.30 459 | Module::Runtime 0.009 460 | base 0 461 | strict 0 462 | warnings 0 463 | Encode-Newlines-0.05 464 | pathname: N/NE/NEILB/Encode-Newlines-0.05.tar.gz 465 | provides: 466 | Encode::Newlines 0.05 467 | requirements: 468 | Carp 0 469 | Encode::Encoding 0 470 | ExtUtils::MakeMaker 0 471 | constant 0 472 | parent 0 473 | perl 5.007003 474 | strict 0 475 | warnings 0 476 | Eval-Closure-0.14 477 | pathname: D/DO/DOY/Eval-Closure-0.14.tar.gz 478 | provides: 479 | Eval::Closure 0.14 480 | requirements: 481 | Carp 0 482 | Exporter 0 483 | ExtUtils::MakeMaker 0 484 | Scalar::Util 0 485 | constant 0 486 | overload 0 487 | strict 0 488 | warnings 0 489 | Exporter-Lite-0.08 490 | pathname: N/NE/NEILB/Exporter-Lite-0.08.tar.gz 491 | provides: 492 | Exporter::Lite 0.08 493 | requirements: 494 | Carp 0 495 | ExtUtils::MakeMaker 6.3 496 | perl 5.006 497 | strict 0 498 | warnings 0 499 | ExtUtils-Config-0.008 500 | pathname: L/LE/LEONT/ExtUtils-Config-0.008.tar.gz 501 | provides: 502 | ExtUtils::Config 0.008 503 | requirements: 504 | Data::Dumper 0 505 | ExtUtils::MakeMaker 6.30 506 | strict 0 507 | warnings 0 508 | ExtUtils-Helpers-0.026 509 | pathname: L/LE/LEONT/ExtUtils-Helpers-0.026.tar.gz 510 | provides: 511 | ExtUtils::Helpers 0.026 512 | ExtUtils::Helpers::Unix 0.026 513 | ExtUtils::Helpers::VMS 0.026 514 | ExtUtils::Helpers::Windows 0.026 515 | requirements: 516 | Carp 0 517 | Exporter 5.57 518 | ExtUtils::MakeMaker 0 519 | File::Basename 0 520 | File::Copy 0 521 | File::Spec::Functions 0 522 | Text::ParseWords 3.24 523 | perl 5.006 524 | strict 0 525 | warnings 0 526 | ExtUtils-InstallPaths-0.012 527 | pathname: L/LE/LEONT/ExtUtils-InstallPaths-0.012.tar.gz 528 | provides: 529 | ExtUtils::InstallPaths 0.012 530 | requirements: 531 | Carp 0 532 | ExtUtils::Config 0.002 533 | ExtUtils::MakeMaker 0 534 | File::Spec 0 535 | perl 5.006 536 | strict 0 537 | warnings 0 538 | File-HomeDir-1.006 539 | pathname: R/RE/REHSACK/File-HomeDir-1.006.tar.gz 540 | provides: 541 | File::HomeDir 1.006 542 | File::HomeDir::Darwin 1.006 543 | File::HomeDir::Darwin::Carbon 1.006 544 | File::HomeDir::Darwin::Cocoa 1.006 545 | File::HomeDir::Driver 1.006 546 | File::HomeDir::FreeDesktop 1.006 547 | File::HomeDir::MacOS9 1.006 548 | File::HomeDir::Test 1.006 549 | File::HomeDir::Unix 1.006 550 | File::HomeDir::Windows 1.006 551 | requirements: 552 | Carp 0 553 | Cwd 3.12 554 | ExtUtils::MakeMaker 0 555 | File::Basename 0 556 | File::Path 2.01 557 | File::Spec 3.12 558 | File::Temp 0.19 559 | File::Which 0.05 560 | POSIX 0 561 | perl 5.008003 562 | File-Which-1.23 563 | pathname: P/PL/PLICEASE/File-Which-1.23.tar.gz 564 | provides: 565 | File::Which 1.23 566 | requirements: 567 | ExtUtils::MakeMaker 0 568 | perl 5.006 569 | File-pushd-1.016 570 | pathname: D/DA/DAGOLDEN/File-pushd-1.016.tar.gz 571 | provides: 572 | File::pushd 1.016 573 | requirements: 574 | Carp 0 575 | Cwd 0 576 | Exporter 0 577 | ExtUtils::MakeMaker 6.17 578 | File::Path 0 579 | File::Spec 0 580 | File::Temp 0 581 | overload 0 582 | perl 5.006 583 | strict 0 584 | warnings 0 585 | Guard-1.023 586 | pathname: M/ML/MLEHMANN/Guard-1.023.tar.gz 587 | provides: 588 | Guard 1.023 589 | requirements: 590 | ExtUtils::MakeMaker 0 591 | IO-AIO-4.72 592 | pathname: M/ML/MLEHMANN/IO-AIO-4.72.tar.gz 593 | provides: 594 | IO::AIO 4.72 595 | requirements: 596 | Canary::Stability 2001 597 | ExtUtils::MakeMaker 6.52 598 | common::sense 0 599 | IO-String-1.08 600 | pathname: G/GA/GAAS/IO-String-1.08.tar.gz 601 | provides: 602 | IO::String 1.08 603 | requirements: 604 | ExtUtils::MakeMaker 0 605 | IPC-Run3-0.048 606 | pathname: R/RJ/RJBS/IPC-Run3-0.048.tar.gz 607 | provides: 608 | IPC::Run3 0.048 609 | requirements: 610 | ExtUtils::MakeMaker 0 611 | Test::More 0.31 612 | Time::HiRes 0 613 | IPC-System-Simple-1.30 614 | pathname: J/JK/JKEENAN/IPC-System-Simple-1.30.tar.gz 615 | provides: 616 | IPC::System::Simple 1.30 617 | requirements: 618 | Carp 0 619 | Exporter 0 620 | ExtUtils::MakeMaker 0 621 | List::Util 0 622 | POSIX 0 623 | Scalar::Util 0 624 | constant 0 625 | perl 5.006 626 | re 0 627 | strict 0 628 | warnings 0 629 | Importer-0.026 630 | pathname: E/EX/EXODIST/Importer-0.026.tar.gz 631 | provides: 632 | Importer 0.026 633 | requirements: 634 | ExtUtils::MakeMaker 0 635 | perl 5.008001 636 | JSON-4.02 637 | pathname: I/IS/ISHIGAKI/JSON-4.02.tar.gz 638 | provides: 639 | JSON 4.02 640 | JSON::Backend::PP 4.02 641 | requirements: 642 | ExtUtils::MakeMaker 0 643 | Test::More 0 644 | List-Compare-0.55 645 | pathname: J/JK/JKEENAN/List-Compare-0.55.tar.gz 646 | provides: 647 | List::Compare 0.55 648 | List::Compare::Accelerated 0.55 649 | List::Compare::Base::_Auxiliary 0.55 650 | List::Compare::Base::_Engine 0.55 651 | List::Compare::Functional 0.55 652 | List::Compare::Multiple 0.55 653 | List::Compare::Multiple::Accelerated 0.55 654 | requirements: 655 | ExtUtils::MakeMaker 0 656 | List-SomeUtils-0.58 657 | pathname: D/DR/DROLSKY/List-SomeUtils-0.58.tar.gz 658 | provides: 659 | List::SomeUtils 0.58 660 | List::SomeUtils::PP 0.58 661 | requirements: 662 | Carp 0 663 | Exporter 0 664 | ExtUtils::MakeMaker 0 665 | List::SomeUtils::XS 0.54 666 | List::Util 0 667 | Module::Implementation 0 668 | Text::ParseWords 0 669 | perl 5.006 670 | strict 0 671 | vars 0 672 | warnings 0 673 | List-SomeUtils-XS-0.58 674 | pathname: D/DR/DROLSKY/List-SomeUtils-XS-0.58.tar.gz 675 | provides: 676 | List::SomeUtils::XS 0.58 677 | requirements: 678 | ExtUtils::MakeMaker 0 679 | XSLoader 0 680 | strict 0 681 | warnings 0 682 | Log-Any-1.708 683 | pathname: P/PR/PREACTION/Log-Any-1.708.tar.gz 684 | provides: 685 | Log::Any 1.708 686 | Log::Any::Adapter 1.708 687 | Log::Any::Adapter::Base 1.708 688 | Log::Any::Adapter::Capture 1.708 689 | Log::Any::Adapter::File 1.708 690 | Log::Any::Adapter::Multiplex 1.708 691 | Log::Any::Adapter::Null 1.708 692 | Log::Any::Adapter::Stderr 1.708 693 | Log::Any::Adapter::Stdout 1.708 694 | Log::Any::Adapter::Syslog 1.708 695 | Log::Any::Adapter::Test 1.708 696 | Log::Any::Adapter::Util 1.708 697 | Log::Any::Manager 1.708 698 | Log::Any::Proxy 1.708 699 | Log::Any::Proxy::Null 1.708 700 | Log::Any::Proxy::Test 1.708 701 | Log::Any::Test 1.708 702 | requirements: 703 | B 0 704 | Carp 0 705 | Data::Dumper 0 706 | Exporter 0 707 | ExtUtils::MakeMaker 0 708 | Fcntl 0 709 | File::Basename 0 710 | FindBin 0 711 | IO::File 0 712 | List::Util 0 713 | Storable 0 714 | Sys::Syslog 0 715 | Test::Builder 0 716 | constant 0 717 | strict 0 718 | warnings 0 719 | MRO-Compat-0.13 720 | pathname: H/HA/HAARG/MRO-Compat-0.13.tar.gz 721 | provides: 722 | MRO::Compat 0.13 723 | requirements: 724 | ExtUtils::MakeMaker 0 725 | perl 5.006 726 | Mixin-Linewise-0.108 727 | pathname: R/RJ/RJBS/Mixin-Linewise-0.108.tar.gz 728 | provides: 729 | Mixin::Linewise 0.108 730 | Mixin::Linewise::Readers 0.108 731 | Mixin::Linewise::Writers 0.108 732 | requirements: 733 | Carp 0 734 | ExtUtils::MakeMaker 0 735 | IO::File 0 736 | PerlIO::utf8_strict 0 737 | Sub::Exporter 0 738 | perl 5.008001 739 | strict 0 740 | warnings 0 741 | Module-Build-0.4231 742 | pathname: L/LE/LEONT/Module-Build-0.4231.tar.gz 743 | provides: 744 | Module::Build 0.4231 745 | Module::Build::Base 0.4231 746 | Module::Build::Compat 0.4231 747 | Module::Build::Config 0.4231 748 | Module::Build::Cookbook 0.4231 749 | Module::Build::Dumper 0.4231 750 | Module::Build::Notes 0.4231 751 | Module::Build::PPMMaker 0.4231 752 | Module::Build::Platform::Default 0.4231 753 | Module::Build::Platform::MacOS 0.4231 754 | Module::Build::Platform::Unix 0.4231 755 | Module::Build::Platform::VMS 0.4231 756 | Module::Build::Platform::VOS 0.4231 757 | Module::Build::Platform::Windows 0.4231 758 | Module::Build::Platform::aix 0.4231 759 | Module::Build::Platform::cygwin 0.4231 760 | Module::Build::Platform::darwin 0.4231 761 | Module::Build::Platform::os2 0.4231 762 | Module::Build::PodParser 0.4231 763 | requirements: 764 | CPAN::Meta 2.142060 765 | Cwd 0 766 | Data::Dumper 0 767 | ExtUtils::CBuilder 0.27 768 | ExtUtils::Install 0 769 | ExtUtils::Manifest 0 770 | ExtUtils::Mkbootstrap 0 771 | ExtUtils::ParseXS 2.21 772 | File::Basename 0 773 | File::Compare 0 774 | File::Copy 0 775 | File::Find 0 776 | File::Path 0 777 | File::Spec 0.82 778 | Getopt::Long 0 779 | Module::Metadata 1.000002 780 | Perl::OSType 1 781 | Pod::Man 2.17 782 | TAP::Harness 3.29 783 | Text::Abbrev 0 784 | Text::ParseWords 0 785 | perl 5.006001 786 | version 0.87 787 | Module-Build-Tiny-0.039 788 | pathname: L/LE/LEONT/Module-Build-Tiny-0.039.tar.gz 789 | provides: 790 | Module::Build::Tiny 0.039 791 | requirements: 792 | CPAN::Meta 0 793 | DynaLoader 0 794 | Exporter 5.57 795 | ExtUtils::CBuilder 0 796 | ExtUtils::Config 0.003 797 | ExtUtils::Helpers 0.020 798 | ExtUtils::Install 0 799 | ExtUtils::InstallPaths 0.002 800 | ExtUtils::ParseXS 0 801 | File::Basename 0 802 | File::Find 0 803 | File::Path 0 804 | File::Spec::Functions 0 805 | Getopt::Long 2.36 806 | JSON::PP 2 807 | Pod::Man 0 808 | TAP::Harness::Env 0 809 | perl 5.006 810 | strict 0 811 | warnings 0 812 | Module-Build-XSUtil-0.19 813 | pathname: H/HI/HIDEAKIO/Module-Build-XSUtil-0.19.tar.gz 814 | provides: 815 | Module::Build::XSUtil 0.19 816 | requirements: 817 | Devel::CheckCompiler 0 818 | Devel::PPPort 0 819 | Exporter 0 820 | ExtUtils::CBuilder 0 821 | File::Basename 0 822 | File::Path 0 823 | Module::Build 0.4005 824 | XSLoader 0 825 | parent 0 826 | perl 5.008001 827 | Module-Implementation-0.09 828 | pathname: D/DR/DROLSKY/Module-Implementation-0.09.tar.gz 829 | provides: 830 | Module::Implementation 0.09 831 | requirements: 832 | Carp 0 833 | ExtUtils::MakeMaker 0 834 | Module::Runtime 0.012 835 | Try::Tiny 0 836 | strict 0 837 | warnings 0 838 | Module-Pluggable-5.2 839 | pathname: S/SI/SIMONW/Module-Pluggable-5.2.tar.gz 840 | provides: 841 | Devel::InnerPackage 0.4 842 | Module::Pluggable 5.2 843 | Module::Pluggable::Object 5.2 844 | requirements: 845 | Exporter 5.57 846 | ExtUtils::MakeMaker 0 847 | File::Basename 0 848 | File::Find 0 849 | File::Spec 3.00 850 | File::Spec::Functions 0 851 | if 0 852 | perl 5.00503 853 | strict 0 854 | Module-Runtime-0.016 855 | pathname: Z/ZE/ZEFRAM/Module-Runtime-0.016.tar.gz 856 | provides: 857 | Module::Runtime 0.016 858 | requirements: 859 | Module::Build 0 860 | Test::More 0.41 861 | perl 5.006 862 | strict 0 863 | warnings 0 864 | Module-Runtime-Conflicts-0.003 865 | pathname: E/ET/ETHER/Module-Runtime-Conflicts-0.003.tar.gz 866 | provides: 867 | Module::Runtime::Conflicts 0.003 868 | requirements: 869 | Dist::CheckConflicts 0 870 | ExtUtils::MakeMaker 0 871 | Module::Runtime 0 872 | perl 5.006 873 | strict 0 874 | warnings 0 875 | Moo-2.004000 876 | pathname: H/HA/HAARG/Moo-2.004000.tar.gz 877 | provides: 878 | Method::Generate::Accessor undef 879 | Method::Generate::BuildAll undef 880 | Method::Generate::Constructor undef 881 | Method::Generate::DemolishAll undef 882 | Moo 2.004000 883 | Moo::HandleMoose undef 884 | Moo::HandleMoose::FakeConstructor undef 885 | Moo::HandleMoose::FakeMetaClass undef 886 | Moo::HandleMoose::_TypeMap undef 887 | Moo::Object undef 888 | Moo::Role 2.004000 889 | Moo::_Utils undef 890 | Moo::_mro undef 891 | Moo::_strictures undef 892 | Moo::sification undef 893 | oo undef 894 | requirements: 895 | Class::Method::Modifiers 1.10 896 | Exporter 5.57 897 | ExtUtils::MakeMaker 0 898 | Module::Runtime 0.014 899 | Role::Tiny 2.001004 900 | Scalar::Util 1.00 901 | Sub::Defer 2.006006 902 | Sub::Quote 2.006006 903 | perl 5.006 904 | Moose-2.2013 905 | pathname: E/ET/ETHER/Moose-2.2013.tar.gz 906 | provides: 907 | Class::MOP 2.2013 908 | Class::MOP::Attribute 2.2013 909 | Class::MOP::Class 2.2013 910 | Class::MOP::Instance 2.2013 911 | Class::MOP::Method 2.2013 912 | Class::MOP::Method::Accessor 2.2013 913 | Class::MOP::Method::Constructor 2.2013 914 | Class::MOP::Method::Generated 2.2013 915 | Class::MOP::Method::Inlined 2.2013 916 | Class::MOP::Method::Meta 2.2013 917 | Class::MOP::Method::Wrapped 2.2013 918 | Class::MOP::Module 2.2013 919 | Class::MOP::Object 2.2013 920 | Class::MOP::Overload 2.2013 921 | Class::MOP::Package 2.2013 922 | Moose 2.2013 923 | Moose::Cookbook 2.2013 924 | Moose::Cookbook::Basics::BankAccount_MethodModifiersAndSubclassing 2.2013 925 | Moose::Cookbook::Basics::BinaryTree_AttributeFeatures 2.2013 926 | Moose::Cookbook::Basics::BinaryTree_BuilderAndLazyBuild 2.2013 927 | Moose::Cookbook::Basics::Company_Subtypes 2.2013 928 | Moose::Cookbook::Basics::DateTime_ExtendingNonMooseParent 2.2013 929 | Moose::Cookbook::Basics::Document_AugmentAndInner 2.2013 930 | Moose::Cookbook::Basics::Genome_OverloadingSubtypesAndCoercion 2.2013 931 | Moose::Cookbook::Basics::HTTP_SubtypesAndCoercion 2.2013 932 | Moose::Cookbook::Basics::Immutable 2.2013 933 | Moose::Cookbook::Basics::Person_BUILDARGSAndBUILD 2.2013 934 | Moose::Cookbook::Basics::Point_AttributesAndSubclassing 2.2013 935 | Moose::Cookbook::Extending::Debugging_BaseClassRole 2.2013 936 | Moose::Cookbook::Extending::ExtensionOverview 2.2013 937 | Moose::Cookbook::Extending::Mooseish_MooseSugar 2.2013 938 | Moose::Cookbook::Legacy::Debugging_BaseClassReplacement 2.2013 939 | Moose::Cookbook::Legacy::Labeled_AttributeMetaclass 2.2013 940 | Moose::Cookbook::Legacy::Table_ClassMetaclass 2.2013 941 | Moose::Cookbook::Meta::GlobRef_InstanceMetaclass 2.2013 942 | Moose::Cookbook::Meta::Labeled_AttributeTrait 2.2013 943 | Moose::Cookbook::Meta::PrivateOrPublic_MethodMetaclass 2.2013 944 | Moose::Cookbook::Meta::Table_MetaclassTrait 2.2013 945 | Moose::Cookbook::Meta::WhyMeta 2.2013 946 | Moose::Cookbook::Roles::ApplicationToInstance 2.2013 947 | Moose::Cookbook::Roles::Comparable_CodeReuse 2.2013 948 | Moose::Cookbook::Roles::Restartable_AdvancedComposition 2.2013 949 | Moose::Cookbook::Snack::Keywords 2.2013 950 | Moose::Cookbook::Snack::Types 2.2013 951 | Moose::Cookbook::Style 2.2013 952 | Moose::Exception 2.2013 953 | Moose::Exception::AccessorMustReadWrite 2.2013 954 | Moose::Exception::AddParameterizableTypeTakesParameterizableType 2.2013 955 | Moose::Exception::AddRoleTakesAMooseMetaRoleInstance 2.2013 956 | Moose::Exception::AddRoleToARoleTakesAMooseMetaRole 2.2013 957 | Moose::Exception::ApplyTakesABlessedInstance 2.2013 958 | Moose::Exception::AttachToClassNeedsAClassMOPClassInstanceOrASubclass 2.2013 959 | Moose::Exception::AttributeConflictInRoles 2.2013 960 | Moose::Exception::AttributeConflictInSummation 2.2013 961 | Moose::Exception::AttributeExtensionIsNotSupportedInRoles 2.2013 962 | Moose::Exception::AttributeIsRequired 2.2013 963 | Moose::Exception::AttributeMustBeAnClassMOPMixinAttributeCoreOrSubclass 2.2013 964 | Moose::Exception::AttributeNamesDoNotMatch 2.2013 965 | Moose::Exception::AttributeValueIsNotAnObject 2.2013 966 | Moose::Exception::AttributeValueIsNotDefined 2.2013 967 | Moose::Exception::AutoDeRefNeedsArrayRefOrHashRef 2.2013 968 | Moose::Exception::BadOptionFormat 2.2013 969 | Moose::Exception::BothBuilderAndDefaultAreNotAllowed 2.2013 970 | Moose::Exception::BuilderDoesNotExist 2.2013 971 | Moose::Exception::BuilderMethodNotSupportedForAttribute 2.2013 972 | Moose::Exception::BuilderMethodNotSupportedForInlineAttribute 2.2013 973 | Moose::Exception::BuilderMustBeAMethodName 2.2013 974 | Moose::Exception::CallingMethodOnAnImmutableInstance 2.2013 975 | Moose::Exception::CallingReadOnlyMethodOnAnImmutableInstance 2.2013 976 | Moose::Exception::CanExtendOnlyClasses 2.2013 977 | Moose::Exception::CanOnlyConsumeRole 2.2013 978 | Moose::Exception::CanOnlyWrapBlessedCode 2.2013 979 | Moose::Exception::CanReblessOnlyIntoASubclass 2.2013 980 | Moose::Exception::CanReblessOnlyIntoASuperclass 2.2013 981 | Moose::Exception::CannotAddAdditionalTypeCoercionsToUnion 2.2013 982 | Moose::Exception::CannotAddAsAnAttributeToARole 2.2013 983 | Moose::Exception::CannotApplyBaseClassRolesToRole 2.2013 984 | Moose::Exception::CannotAssignValueToReadOnlyAccessor 2.2013 985 | Moose::Exception::CannotAugmentIfLocalMethodPresent 2.2013 986 | Moose::Exception::CannotAugmentNoSuperMethod 2.2013 987 | Moose::Exception::CannotAutoDerefWithoutIsa 2.2013 988 | Moose::Exception::CannotAutoDereferenceTypeConstraint 2.2013 989 | Moose::Exception::CannotCalculateNativeType 2.2013 990 | Moose::Exception::CannotCallAnAbstractBaseMethod 2.2013 991 | Moose::Exception::CannotCallAnAbstractMethod 2.2013 992 | Moose::Exception::CannotCoerceAWeakRef 2.2013 993 | Moose::Exception::CannotCoerceAttributeWhichHasNoCoercion 2.2013 994 | Moose::Exception::CannotCreateHigherOrderTypeWithoutATypeParameter 2.2013 995 | Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresent 2.2013 996 | Moose::Exception::CannotCreateMethodAliasLocalMethodIsPresentInClass 2.2013 997 | Moose::Exception::CannotDelegateLocalMethodIsPresent 2.2013 998 | Moose::Exception::CannotDelegateWithoutIsa 2.2013 999 | Moose::Exception::CannotFindDelegateMetaclass 2.2013 1000 | Moose::Exception::CannotFindType 2.2013 1001 | Moose::Exception::CannotFindTypeGivenToMatchOnType 2.2013 1002 | Moose::Exception::CannotFixMetaclassCompatibility 2.2013 1003 | Moose::Exception::CannotGenerateInlineConstraint 2.2013 1004 | Moose::Exception::CannotInitializeMooseMetaRoleComposite 2.2013 1005 | Moose::Exception::CannotInlineTypeConstraintCheck 2.2013 1006 | Moose::Exception::CannotLocatePackageInINC 2.2013 1007 | Moose::Exception::CannotMakeMetaclassCompatible 2.2013 1008 | Moose::Exception::CannotOverrideALocalMethod 2.2013 1009 | Moose::Exception::CannotOverrideBodyOfMetaMethods 2.2013 1010 | Moose::Exception::CannotOverrideLocalMethodIsPresent 2.2013 1011 | Moose::Exception::CannotOverrideNoSuperMethod 2.2013 1012 | Moose::Exception::CannotRegisterUnnamedTypeConstraint 2.2013 1013 | Moose::Exception::CannotUseLazyBuildAndDefaultSimultaneously 2.2013 1014 | Moose::Exception::CircularReferenceInAlso 2.2013 1015 | Moose::Exception::ClassDoesNotHaveInitMeta 2.2013 1016 | Moose::Exception::ClassDoesTheExcludedRole 2.2013 1017 | Moose::Exception::ClassNamesDoNotMatch 2.2013 1018 | Moose::Exception::CloneObjectExpectsAnInstanceOfMetaclass 2.2013 1019 | Moose::Exception::CodeBlockMustBeACodeRef 2.2013 1020 | Moose::Exception::CoercingWithoutCoercions 2.2013 1021 | Moose::Exception::CoercionAlreadyExists 2.2013 1022 | Moose::Exception::CoercionNeedsTypeConstraint 2.2013 1023 | Moose::Exception::ConflictDetectedInCheckRoleExclusions 2.2013 1024 | Moose::Exception::ConflictDetectedInCheckRoleExclusionsInToClass 2.2013 1025 | Moose::Exception::ConstructClassInstanceTakesPackageName 2.2013 1026 | Moose::Exception::CouldNotCreateMethod 2.2013 1027 | Moose::Exception::CouldNotCreateWriter 2.2013 1028 | Moose::Exception::CouldNotEvalConstructor 2.2013 1029 | Moose::Exception::CouldNotEvalDestructor 2.2013 1030 | Moose::Exception::CouldNotFindTypeConstraintToCoerceFrom 2.2013 1031 | Moose::Exception::CouldNotGenerateInlineAttributeMethod 2.2013 1032 | Moose::Exception::CouldNotLocateTypeConstraintForUnion 2.2013 1033 | Moose::Exception::CouldNotParseType 2.2013 1034 | Moose::Exception::CreateMOPClassTakesArrayRefOfAttributes 2.2013 1035 | Moose::Exception::CreateMOPClassTakesArrayRefOfSuperclasses 2.2013 1036 | Moose::Exception::CreateMOPClassTakesHashRefOfMethods 2.2013 1037 | Moose::Exception::CreateTakesArrayRefOfRoles 2.2013 1038 | Moose::Exception::CreateTakesHashRefOfAttributes 2.2013 1039 | Moose::Exception::CreateTakesHashRefOfMethods 2.2013 1040 | Moose::Exception::DefaultToMatchOnTypeMustBeCodeRef 2.2013 1041 | Moose::Exception::DelegationToAClassWhichIsNotLoaded 2.2013 1042 | Moose::Exception::DelegationToARoleWhichIsNotLoaded 2.2013 1043 | Moose::Exception::DelegationToATypeWhichIsNotAClass 2.2013 1044 | Moose::Exception::DoesRequiresRoleName 2.2013 1045 | Moose::Exception::EnumCalledWithAnArrayRefAndAdditionalArgs 2.2013 1046 | Moose::Exception::EnumValuesMustBeString 2.2013 1047 | Moose::Exception::ExtendsMissingArgs 2.2013 1048 | Moose::Exception::HandlesMustBeAHashRef 2.2013 1049 | Moose::Exception::IllegalInheritedOptions 2.2013 1050 | Moose::Exception::IllegalMethodTypeToAddMethodModifier 2.2013 1051 | Moose::Exception::IncompatibleMetaclassOfSuperclass 2.2013 1052 | Moose::Exception::InitMetaRequiresClass 2.2013 1053 | Moose::Exception::InitializeTakesUnBlessedPackageName 2.2013 1054 | Moose::Exception::InstanceBlessedIntoWrongClass 2.2013 1055 | Moose::Exception::InstanceMustBeABlessedReference 2.2013 1056 | Moose::Exception::InvalidArgPassedToMooseUtilMetaRole 2.2013 1057 | Moose::Exception::InvalidArgumentToMethod 2.2013 1058 | Moose::Exception::InvalidArgumentsToTraitAliases 2.2013 1059 | Moose::Exception::InvalidBaseTypeGivenToCreateParameterizedTypeConstraint 2.2013 1060 | Moose::Exception::InvalidHandleValue 2.2013 1061 | Moose::Exception::InvalidHasProvidedInARole 2.2013 1062 | Moose::Exception::InvalidNameForType 2.2013 1063 | Moose::Exception::InvalidOverloadOperator 2.2013 1064 | Moose::Exception::InvalidRoleApplication 2.2013 1065 | Moose::Exception::InvalidTypeConstraint 2.2013 1066 | Moose::Exception::InvalidTypeGivenToCreateParameterizedTypeConstraint 2.2013 1067 | Moose::Exception::InvalidValueForIs 2.2013 1068 | Moose::Exception::IsaDoesNotDoTheRole 2.2013 1069 | Moose::Exception::IsaLacksDoesMethod 2.2013 1070 | Moose::Exception::LazyAttributeNeedsADefault 2.2013 1071 | Moose::Exception::Legacy 2.2013 1072 | Moose::Exception::MOPAttributeNewNeedsAttributeName 2.2013 1073 | Moose::Exception::MatchActionMustBeACodeRef 2.2013 1074 | Moose::Exception::MessageParameterMustBeCodeRef 2.2013 1075 | Moose::Exception::MetaclassIsAClassNotASubclassOfGivenMetaclass 2.2013 1076 | Moose::Exception::MetaclassIsARoleNotASubclassOfGivenMetaclass 2.2013 1077 | Moose::Exception::MetaclassIsNotASubclassOfGivenMetaclass 2.2013 1078 | Moose::Exception::MetaclassMustBeASubclassOfMooseMetaClass 2.2013 1079 | Moose::Exception::MetaclassMustBeASubclassOfMooseMetaRole 2.2013 1080 | Moose::Exception::MetaclassMustBeDerivedFromClassMOPClass 2.2013 1081 | Moose::Exception::MetaclassNotLoaded 2.2013 1082 | Moose::Exception::MetaclassTypeIncompatible 2.2013 1083 | Moose::Exception::MethodExpectedAMetaclassObject 2.2013 1084 | Moose::Exception::MethodExpectsFewerArgs 2.2013 1085 | Moose::Exception::MethodExpectsMoreArgs 2.2013 1086 | Moose::Exception::MethodModifierNeedsMethodName 2.2013 1087 | Moose::Exception::MethodNameConflictInRoles 2.2013 1088 | Moose::Exception::MethodNameNotFoundInInheritanceHierarchy 2.2013 1089 | Moose::Exception::MethodNameNotGiven 2.2013 1090 | Moose::Exception::MustDefineAMethodName 2.2013 1091 | Moose::Exception::MustDefineAnAttributeName 2.2013 1092 | Moose::Exception::MustDefineAnOverloadOperator 2.2013 1093 | Moose::Exception::MustHaveAtLeastOneValueToEnumerate 2.2013 1094 | Moose::Exception::MustPassAHashOfOptions 2.2013 1095 | Moose::Exception::MustPassAMooseMetaRoleInstanceOrSubclass 2.2013 1096 | Moose::Exception::MustPassAPackageNameOrAnExistingClassMOPPackageInstance 2.2013 1097 | Moose::Exception::MustPassEvenNumberOfArguments 2.2013 1098 | Moose::Exception::MustPassEvenNumberOfAttributeOptions 2.2013 1099 | Moose::Exception::MustProvideANameForTheAttribute 2.2013 1100 | Moose::Exception::MustSpecifyAtleastOneMethod 2.2013 1101 | Moose::Exception::MustSpecifyAtleastOneRole 2.2013 1102 | Moose::Exception::MustSpecifyAtleastOneRoleToApplicant 2.2013 1103 | Moose::Exception::MustSupplyAClassMOPAttributeInstance 2.2013 1104 | Moose::Exception::MustSupplyADelegateToMethod 2.2013 1105 | Moose::Exception::MustSupplyAMetaclass 2.2013 1106 | Moose::Exception::MustSupplyAMooseMetaAttributeInstance 2.2013 1107 | Moose::Exception::MustSupplyAnAccessorTypeToConstructWith 2.2013 1108 | Moose::Exception::MustSupplyAnAttributeToConstructWith 2.2013 1109 | Moose::Exception::MustSupplyArrayRefAsCurriedArguments 2.2013 1110 | Moose::Exception::MustSupplyPackageNameAndName 2.2013 1111 | Moose::Exception::NeedsTypeConstraintUnionForTypeCoercionUnion 2.2013 1112 | Moose::Exception::NeitherAttributeNorAttributeNameIsGiven 2.2013 1113 | Moose::Exception::NeitherClassNorClassNameIsGiven 2.2013 1114 | Moose::Exception::NeitherRoleNorRoleNameIsGiven 2.2013 1115 | Moose::Exception::NeitherTypeNorTypeNameIsGiven 2.2013 1116 | Moose::Exception::NoAttributeFoundInSuperClass 2.2013 1117 | Moose::Exception::NoBodyToInitializeInAnAbstractBaseClass 2.2013 1118 | Moose::Exception::NoCasesMatched 2.2013 1119 | Moose::Exception::NoConstraintCheckForTypeConstraint 2.2013 1120 | Moose::Exception::NoDestructorClassSpecified 2.2013 1121 | Moose::Exception::NoImmutableTraitSpecifiedForClass 2.2013 1122 | Moose::Exception::NoParentGivenToSubtype 2.2013 1123 | Moose::Exception::OnlyInstancesCanBeCloned 2.2013 1124 | Moose::Exception::OperatorIsRequired 2.2013 1125 | Moose::Exception::OverloadConflictInSummation 2.2013 1126 | Moose::Exception::OverloadRequiresAMetaClass 2.2013 1127 | Moose::Exception::OverloadRequiresAMetaMethod 2.2013 1128 | Moose::Exception::OverloadRequiresAMetaOverload 2.2013 1129 | Moose::Exception::OverloadRequiresAMethodNameOrCoderef 2.2013 1130 | Moose::Exception::OverloadRequiresAnOperator 2.2013 1131 | Moose::Exception::OverloadRequiresNamesForCoderef 2.2013 1132 | Moose::Exception::OverrideConflictInComposition 2.2013 1133 | Moose::Exception::OverrideConflictInSummation 2.2013 1134 | Moose::Exception::PackageDoesNotUseMooseExporter 2.2013 1135 | Moose::Exception::PackageNameAndNameParamsNotGivenToWrap 2.2013 1136 | Moose::Exception::PackagesAndModulesAreNotCachable 2.2013 1137 | Moose::Exception::ParameterIsNotSubtypeOfParent 2.2013 1138 | Moose::Exception::ReferencesAreNotAllowedAsDefault 2.2013 1139 | Moose::Exception::RequiredAttributeLacksInitialization 2.2013 1140 | Moose::Exception::RequiredAttributeNeedsADefault 2.2013 1141 | Moose::Exception::RequiredMethodsImportedByClass 2.2013 1142 | Moose::Exception::RequiredMethodsNotImplementedByClass 2.2013 1143 | Moose::Exception::Role::Attribute 2.2013 1144 | Moose::Exception::Role::AttributeName 2.2013 1145 | Moose::Exception::Role::Class 2.2013 1146 | Moose::Exception::Role::EitherAttributeOrAttributeName 2.2013 1147 | Moose::Exception::Role::Instance 2.2013 1148 | Moose::Exception::Role::InstanceClass 2.2013 1149 | Moose::Exception::Role::InvalidAttributeOptions 2.2013 1150 | Moose::Exception::Role::Method 2.2013 1151 | Moose::Exception::Role::ParamsHash 2.2013 1152 | Moose::Exception::Role::Role 2.2013 1153 | Moose::Exception::Role::RoleForCreate 2.2013 1154 | Moose::Exception::Role::RoleForCreateMOPClass 2.2013 1155 | Moose::Exception::Role::TypeConstraint 2.2013 1156 | Moose::Exception::RoleDoesTheExcludedRole 2.2013 1157 | Moose::Exception::RoleExclusionConflict 2.2013 1158 | Moose::Exception::RoleNameRequired 2.2013 1159 | Moose::Exception::RoleNameRequiredForMooseMetaRole 2.2013 1160 | Moose::Exception::RolesDoNotSupportAugment 2.2013 1161 | Moose::Exception::RolesDoNotSupportExtends 2.2013 1162 | Moose::Exception::RolesDoNotSupportInner 2.2013 1163 | Moose::Exception::RolesDoNotSupportRegexReferencesForMethodModifiers 2.2013 1164 | Moose::Exception::RolesInCreateTakesAnArrayRef 2.2013 1165 | Moose::Exception::RolesListMustBeInstancesOfMooseMetaRole 2.2013 1166 | Moose::Exception::SingleParamsToNewMustBeHashRef 2.2013 1167 | Moose::Exception::TriggerMustBeACodeRef 2.2013 1168 | Moose::Exception::TypeConstraintCannotBeUsedForAParameterizableType 2.2013 1169 | Moose::Exception::TypeConstraintIsAlreadyCreated 2.2013 1170 | Moose::Exception::TypeParameterMustBeMooseMetaType 2.2013 1171 | Moose::Exception::UnableToCanonicalizeHandles 2.2013 1172 | Moose::Exception::UnableToCanonicalizeNonRolePackage 2.2013 1173 | Moose::Exception::UnableToRecognizeDelegateMetaclass 2.2013 1174 | Moose::Exception::UndefinedHashKeysPassedToMethod 2.2013 1175 | Moose::Exception::UnionCalledWithAnArrayRefAndAdditionalArgs 2.2013 1176 | Moose::Exception::UnionTakesAtleastTwoTypeNames 2.2013 1177 | Moose::Exception::ValidationFailedForInlineTypeConstraint 2.2013 1178 | Moose::Exception::ValidationFailedForTypeConstraint 2.2013 1179 | Moose::Exception::WrapTakesACodeRefToBless 2.2013 1180 | Moose::Exception::WrongTypeConstraintGiven 2.2013 1181 | Moose::Exporter 2.2013 1182 | Moose::Intro 2.2013 1183 | Moose::Manual 2.2013 1184 | Moose::Manual::Attributes 2.2013 1185 | Moose::Manual::BestPractices 2.2013 1186 | Moose::Manual::Classes 2.2013 1187 | Moose::Manual::Concepts 2.2013 1188 | Moose::Manual::Construction 2.2013 1189 | Moose::Manual::Contributing 2.2013 1190 | Moose::Manual::Delegation 2.2013 1191 | Moose::Manual::Delta 2.2013 1192 | Moose::Manual::Exceptions 2.2013 1193 | Moose::Manual::Exceptions::Manifest 2.2013 1194 | Moose::Manual::FAQ 2.2013 1195 | Moose::Manual::MOP 2.2013 1196 | Moose::Manual::MethodModifiers 2.2013 1197 | Moose::Manual::MooseX 2.2013 1198 | Moose::Manual::Resources 2.2013 1199 | Moose::Manual::Roles 2.2013 1200 | Moose::Manual::Support 2.2013 1201 | Moose::Manual::Types 2.2013 1202 | Moose::Manual::Unsweetened 2.2013 1203 | Moose::Meta::Attribute 2.2013 1204 | Moose::Meta::Attribute::Native 2.2013 1205 | Moose::Meta::Attribute::Native::Trait::Array 2.2013 1206 | Moose::Meta::Attribute::Native::Trait::Bool 2.2013 1207 | Moose::Meta::Attribute::Native::Trait::Code 2.2013 1208 | Moose::Meta::Attribute::Native::Trait::Counter 2.2013 1209 | Moose::Meta::Attribute::Native::Trait::Hash 2.2013 1210 | Moose::Meta::Attribute::Native::Trait::Number 2.2013 1211 | Moose::Meta::Attribute::Native::Trait::String 2.2013 1212 | Moose::Meta::Class 2.2013 1213 | Moose::Meta::Instance 2.2013 1214 | Moose::Meta::Method 2.2013 1215 | Moose::Meta::Method::Accessor 2.2013 1216 | Moose::Meta::Method::Augmented 2.2013 1217 | Moose::Meta::Method::Constructor 2.2013 1218 | Moose::Meta::Method::Delegation 2.2013 1219 | Moose::Meta::Method::Destructor 2.2013 1220 | Moose::Meta::Method::Meta 2.2013 1221 | Moose::Meta::Method::Overridden 2.2013 1222 | Moose::Meta::Role 2.2013 1223 | Moose::Meta::Role::Application 2.2013 1224 | Moose::Meta::Role::Application::RoleSummation 2.2013 1225 | Moose::Meta::Role::Application::ToClass 2.2013 1226 | Moose::Meta::Role::Application::ToInstance 2.2013 1227 | Moose::Meta::Role::Application::ToRole 2.2013 1228 | Moose::Meta::Role::Attribute 2.2013 1229 | Moose::Meta::Role::Composite 2.2013 1230 | Moose::Meta::Role::Method 2.2013 1231 | Moose::Meta::Role::Method::Conflicting 2.2013 1232 | Moose::Meta::Role::Method::Required 2.2013 1233 | Moose::Meta::TypeCoercion 2.2013 1234 | Moose::Meta::TypeCoercion::Union 2.2013 1235 | Moose::Meta::TypeConstraint 2.2013 1236 | Moose::Meta::TypeConstraint::Class 2.2013 1237 | Moose::Meta::TypeConstraint::DuckType 2.2013 1238 | Moose::Meta::TypeConstraint::Enum 2.2013 1239 | Moose::Meta::TypeConstraint::Parameterizable 2.2013 1240 | Moose::Meta::TypeConstraint::Parameterized 2.2013 1241 | Moose::Meta::TypeConstraint::Registry 2.2013 1242 | Moose::Meta::TypeConstraint::Role 2.2013 1243 | Moose::Meta::TypeConstraint::Union 2.2013 1244 | Moose::Object 2.2013 1245 | Moose::Role 2.2013 1246 | Moose::Spec::Role 2.2013 1247 | Moose::Unsweetened 2.2013 1248 | Moose::Util 2.2013 1249 | Moose::Util::MetaRole 2.2013 1250 | Moose::Util::TypeConstraints 2.2013 1251 | Test::Moose 2.2013 1252 | metaclass 2.2013 1253 | oose 2.2013 1254 | requirements: 1255 | Carp 1.22 1256 | Class::Load 0.09 1257 | Class::Load::XS 0.01 1258 | Data::OptList 0.107 1259 | Devel::GlobalDestruction 0 1260 | Devel::OverloadInfo 0.005 1261 | Devel::StackTrace 2.03 1262 | Dist::CheckConflicts 0.02 1263 | Eval::Closure 0.04 1264 | ExtUtils::MakeMaker 0 1265 | List::Util 1.45 1266 | MRO::Compat 0.05 1267 | Module::Runtime 0.014 1268 | Module::Runtime::Conflicts 0.002 1269 | Package::DeprecationManager 0.11 1270 | Package::Stash 0.32 1271 | Package::Stash::XS 0.24 1272 | Params::Util 1.00 1273 | Scalar::Util 1.19 1274 | Sub::Exporter 0.980 1275 | Sub::Identify 0 1276 | Sub::Name 0.20 1277 | Try::Tiny 0.17 1278 | parent 0.223 1279 | strict 1.03 1280 | warnings 1.03 1281 | Package-DeprecationManager-0.17 1282 | pathname: D/DR/DROLSKY/Package-DeprecationManager-0.17.tar.gz 1283 | provides: 1284 | Package::DeprecationManager 0.17 1285 | requirements: 1286 | Carp 0 1287 | ExtUtils::MakeMaker 0 1288 | List::Util 1.33 1289 | Package::Stash 0 1290 | Params::Util 0 1291 | Sub::Install 0 1292 | Sub::Name 0 1293 | strict 0 1294 | warnings 0 1295 | Package-Stash-0.38 1296 | pathname: E/ET/ETHER/Package-Stash-0.38.tar.gz 1297 | provides: 1298 | Package::Stash 0.38 1299 | Package::Stash::PP 0.38 1300 | requirements: 1301 | B 0 1302 | Carp 0 1303 | Config 0 1304 | Dist::CheckConflicts 0.02 1305 | ExtUtils::MakeMaker 0 1306 | File::Spec 0 1307 | Getopt::Long 0 1308 | Module::Implementation 0.06 1309 | Package::Stash::XS 0.26 1310 | Scalar::Util 0 1311 | Symbol 0 1312 | Text::ParseWords 0 1313 | constant 0 1314 | perl 5.008001 1315 | strict 0 1316 | warnings 0 1317 | Package-Stash-XS-0.29 1318 | pathname: E/ET/ETHER/Package-Stash-XS-0.29.tar.gz 1319 | provides: 1320 | Package::Stash::XS 0.29 1321 | requirements: 1322 | ExtUtils::MakeMaker 0 1323 | XSLoader 0 1324 | perl 5.008001 1325 | strict 0 1326 | warnings 0 1327 | PadWalker-2.5 1328 | pathname: R/RO/ROBIN/PadWalker-2.5.tar.gz 1329 | provides: 1330 | PadWalker 2.5 1331 | requirements: 1332 | ExtUtils::MakeMaker 0 1333 | perl 5.008001 1334 | Params-Util-1.101 1335 | pathname: R/RE/REHSACK/Params-Util-1.101.tar.gz 1336 | provides: 1337 | Params::Util 1.101 1338 | Params::Util::PP 1.101 1339 | requirements: 1340 | Carp 0 1341 | ExtUtils::MakeMaker 0 1342 | File::Basename 0 1343 | File::Copy 0 1344 | File::Path 0 1345 | File::Spec 0 1346 | IPC::Cmd 0 1347 | Scalar::Util 1.18 1348 | XSLoader 0.22 1349 | parent 0 1350 | Path-Tiny-0.114 1351 | pathname: D/DA/DAGOLDEN/Path-Tiny-0.114.tar.gz 1352 | provides: 1353 | Path::Tiny 0.114 1354 | Path::Tiny::Error 0.114 1355 | requirements: 1356 | Carp 0 1357 | Cwd 0 1358 | Digest 1.03 1359 | Digest::SHA 5.45 1360 | Encode 0 1361 | Exporter 5.57 1362 | ExtUtils::MakeMaker 6.17 1363 | Fcntl 0 1364 | File::Copy 0 1365 | File::Glob 0 1366 | File::Path 2.07 1367 | File::Spec 0.86 1368 | File::Temp 0.19 1369 | File::stat 0 1370 | constant 0 1371 | overload 0 1372 | perl 5.008001 1373 | strict 0 1374 | warnings 0 1375 | warnings::register 0 1376 | Perl-LanguageServer-2.1.0 1377 | pathname: G/GR/GRICHTER/Perl-LanguageServer-2.1.0.tar.gz 1378 | provides: 1379 | Perl::LanguageServer 2.001000 1380 | Perl::LanguageServer::DebuggerInterface 1.07 1381 | Perl::LanguageServer::DebuggerProcess undef 1382 | Perl::LanguageServer::DevTool undef 1383 | Perl::LanguageServer::IO undef 1384 | Perl::LanguageServer::Methods undef 1385 | Perl::LanguageServer::Methods::DebugAdapter undef 1386 | Perl::LanguageServer::Methods::DebugAdapterInterface undef 1387 | Perl::LanguageServer::Methods::textDocument undef 1388 | Perl::LanguageServer::Methods::workspace undef 1389 | Perl::LanguageServer::Parser undef 1390 | Perl::LanguageServer::Req undef 1391 | Perl::LanguageServer::SyntaxChecker undef 1392 | Perl::LanguageServer::Workspace undef 1393 | requirements: 1394 | AnyEvent 0 1395 | AnyEvent::AIO 0 1396 | Class::Refresh 0 1397 | Compiler::Lexer 0.23 1398 | Coro 0 1399 | Data::Dump 0 1400 | ExtUtils::MakeMaker 0 1401 | IO::AIO 0 1402 | JSON 0 1403 | Moose 0 1404 | PadWalker 0 1405 | Scalar::Util 0 1406 | Test::More 0 1407 | perl 5.014 1408 | Perl-Tidy-20201001 1409 | pathname: S/SH/SHANCOCK/Perl-Tidy-20201001.tar.gz 1410 | provides: 1411 | Perl::Tidy 20201001 1412 | Perl::Tidy::Debugger 20201001 1413 | Perl::Tidy::DevNull 20201001 1414 | Perl::Tidy::Diagnostics 20201001 1415 | Perl::Tidy::FileWriter 20201001 1416 | Perl::Tidy::Formatter 20201001 1417 | Perl::Tidy::HtmlWriter 20201001 1418 | Perl::Tidy::IOScalar 20201001 1419 | Perl::Tidy::IOScalarArray 20201001 1420 | Perl::Tidy::IndentationItem 20201001 1421 | Perl::Tidy::LineBuffer 20201001 1422 | Perl::Tidy::LineSink 20201001 1423 | Perl::Tidy::LineSource 20201001 1424 | Perl::Tidy::Logger 20201001 1425 | Perl::Tidy::Tokenizer 20201001 1426 | Perl::Tidy::VerticalAligner 20201001 1427 | Perl::Tidy::VerticalAligner::Alignment 20201001 1428 | Perl::Tidy::VerticalAligner::Line 20201001 1429 | requirements: 1430 | ExtUtils::MakeMaker 0 1431 | PerlIO-utf8_strict-0.008 1432 | pathname: L/LE/LEONT/PerlIO-utf8_strict-0.008.tar.gz 1433 | provides: 1434 | PerlIO::utf8_strict 0.008 1435 | requirements: 1436 | ExtUtils::MakeMaker 0 1437 | XSLoader 0 1438 | perl 5.008 1439 | strict 0 1440 | warnings 0 1441 | Pod-Coverage-0.23 1442 | pathname: R/RC/RCLAMP/Pod-Coverage-0.23.tar.gz 1443 | provides: 1444 | Pod::Coverage 0.23 1445 | Pod::Coverage::CountParents undef 1446 | Pod::Coverage::ExportOnly undef 1447 | Pod::Coverage::Extractor 0.23 1448 | Pod::Coverage::Overloader undef 1449 | requirements: 1450 | Devel::Symdump 2.01 1451 | ExtUtils::MakeMaker 0 1452 | Pod::Find 0.21 1453 | Pod::Parser 1.13 1454 | Test::More 0 1455 | Pod-Tidy-0.10 1456 | pathname: J/JH/JHOBLITT/Pod-Tidy-0.10.tar.gz 1457 | provides: 1458 | Pod::Tidy 0.10 1459 | Pod::Wrap::Pretty 0.03 1460 | requirements: 1461 | Encode 0 1462 | Encode::Newlines 0.03 1463 | File::Copy 0 1464 | IO::String 0 1465 | Pod::Find 0 1466 | Pod::Simple 0 1467 | Pod::Wrap 0 1468 | Test::Cmd 1.05 1469 | Text::Glob 0.06 1470 | Text::Wrap 0 1471 | Pod-Wrap-0.01 1472 | pathname: N/NU/NUFFIN/Pod-Wrap-0.01.tar.gz 1473 | provides: 1474 | Pod::Wrap 0.01 1475 | requirements: 1476 | Pod::Parser 0 1477 | Text::Wrap 0 1478 | perl v5.6.0 1479 | Reply-0.42 1480 | pathname: D/DO/DOY/Reply-0.42.tar.gz 1481 | provides: 1482 | Reply 0.42 1483 | Reply::App 0.42 1484 | Reply::Config 0.42 1485 | Reply::Plugin 0.42 1486 | Reply::Plugin::AutoRefresh 0.42 1487 | Reply::Plugin::Autocomplete::Commands 0.42 1488 | Reply::Plugin::Autocomplete::Functions 0.42 1489 | Reply::Plugin::Autocomplete::Globals 0.42 1490 | Reply::Plugin::Autocomplete::Keywords 0.42 1491 | Reply::Plugin::Autocomplete::Lexicals 0.42 1492 | Reply::Plugin::Autocomplete::Methods 0.42 1493 | Reply::Plugin::Autocomplete::Packages 0.42 1494 | Reply::Plugin::CollapseStack 0.42 1495 | Reply::Plugin::Colors 0.42 1496 | Reply::Plugin::DataDump 0.42 1497 | Reply::Plugin::DataDumper 0.42 1498 | Reply::Plugin::DataPrinter 0.42 1499 | Reply::Plugin::Editor 0.42 1500 | Reply::Plugin::FancyPrompt 0.42 1501 | Reply::Plugin::Hints 0.42 1502 | Reply::Plugin::Interrupt 0.42 1503 | Reply::Plugin::LexicalPersistence 0.42 1504 | Reply::Plugin::LoadClass 0.42 1505 | Reply::Plugin::Nopaste 0.42 1506 | Reply::Plugin::Packages 0.42 1507 | Reply::Plugin::Pager 0.42 1508 | Reply::Plugin::ReadLine 0.42 1509 | Reply::Plugin::ResultCache 0.42 1510 | Reply::Plugin::Timer 0.42 1511 | requirements: 1512 | Config::INI::Reader::Ordered 0 1513 | Data::Dumper 0 1514 | Devel::LexAlias 0 1515 | Eval::Closure 0.11 1516 | Exporter 0 1517 | ExtUtils::MakeMaker 0 1518 | File::HomeDir 0 1519 | File::Spec 0 1520 | Getopt::Long 2.36 1521 | Module::Runtime 0 1522 | Package::Stash 0 1523 | PadWalker 0 1524 | Scalar::Util 0 1525 | Term::ANSIColor 0 1526 | Term::ReadLine 0 1527 | Time::HiRes 0 1528 | Try::Tiny 0 1529 | base 0 1530 | overload 0 1531 | perl 5.006 1532 | strict 0 1533 | warnings 0 1534 | Role-Tiny-2.001004 1535 | pathname: H/HA/HAARG/Role-Tiny-2.001004.tar.gz 1536 | provides: 1537 | Role::Tiny 2.001004 1538 | Role::Tiny::With 2.001004 1539 | requirements: 1540 | Exporter 5.57 1541 | perl 5.006 1542 | Scope-Guard-0.21 1543 | pathname: C/CH/CHOCOLATE/Scope-Guard-0.21.tar.gz 1544 | provides: 1545 | Scope::Guard 0.21 1546 | requirements: 1547 | ExtUtils::MakeMaker 0 1548 | Test::More 0 1549 | perl 5.006001 1550 | Specio-0.46 1551 | pathname: D/DR/DROLSKY/Specio-0.46.tar.gz 1552 | provides: 1553 | Specio 0.46 1554 | Specio::Coercion 0.46 1555 | Specio::Constraint::AnyCan 0.46 1556 | Specio::Constraint::AnyDoes 0.46 1557 | Specio::Constraint::AnyIsa 0.46 1558 | Specio::Constraint::Enum 0.46 1559 | Specio::Constraint::Intersection 0.46 1560 | Specio::Constraint::ObjectCan 0.46 1561 | Specio::Constraint::ObjectDoes 0.46 1562 | Specio::Constraint::ObjectIsa 0.46 1563 | Specio::Constraint::Parameterizable 0.46 1564 | Specio::Constraint::Parameterized 0.46 1565 | Specio::Constraint::Role::CanType 0.46 1566 | Specio::Constraint::Role::DoesType 0.46 1567 | Specio::Constraint::Role::Interface 0.46 1568 | Specio::Constraint::Role::IsaType 0.46 1569 | Specio::Constraint::Simple 0.46 1570 | Specio::Constraint::Structurable 0.46 1571 | Specio::Constraint::Structured 0.46 1572 | Specio::Constraint::Union 0.46 1573 | Specio::Declare 0.46 1574 | Specio::DeclaredAt 0.46 1575 | Specio::Exception 0.46 1576 | Specio::Exporter 0.46 1577 | Specio::Helpers 0.46 1578 | Specio::Library::Builtins 0.46 1579 | Specio::Library::Numeric 0.46 1580 | Specio::Library::Perl 0.46 1581 | Specio::Library::String 0.46 1582 | Specio::Library::Structured 0.46 1583 | Specio::Library::Structured::Dict 0.46 1584 | Specio::Library::Structured::Map 0.46 1585 | Specio::Library::Structured::Tuple 0.46 1586 | Specio::OO 0.46 1587 | Specio::PartialDump 0.46 1588 | Specio::Registry 0.46 1589 | Specio::Role::Inlinable 0.46 1590 | Specio::Subs 0.46 1591 | Specio::TypeChecks 0.46 1592 | Test::Specio 0.46 1593 | requirements: 1594 | B 0 1595 | Carp 0 1596 | Devel::StackTrace 0 1597 | Eval::Closure 0 1598 | Exporter 0 1599 | ExtUtils::MakeMaker 0 1600 | IO::File 0 1601 | List::Util 1.33 1602 | MRO::Compat 0 1603 | Module::Runtime 0 1604 | Role::Tiny 1.003003 1605 | Role::Tiny::With 0 1606 | Scalar::Util 0 1607 | Storable 0 1608 | Sub::Quote 0 1609 | Test::Fatal 0 1610 | Test::More 0.96 1611 | Try::Tiny 0 1612 | XString 0 1613 | overload 0 1614 | parent 0 1615 | perl 5.008 1616 | re 0 1617 | strict 0 1618 | version 0.83 1619 | warnings 0 1620 | Specio-Library-Path-Tiny-0.04 1621 | pathname: D/DR/DROLSKY/Specio-Library-Path-Tiny-0.04.tar.gz 1622 | provides: 1623 | Specio::Library::Path::Tiny 0.04 1624 | requirements: 1625 | ExtUtils::MakeMaker 0 1626 | Path::Tiny 0.087 1627 | Scalar::Util 0 1628 | Specio 0.29 1629 | Specio::Declare 0 1630 | Specio::Exporter 0 1631 | Specio::Library::Builtins 0 1632 | Specio::PartialDump 0 1633 | overload 0 1634 | parent 0 1635 | strict 0 1636 | warnings 0 1637 | Sub-Exporter-0.987 1638 | pathname: R/RJ/RJBS/Sub-Exporter-0.987.tar.gz 1639 | provides: 1640 | Sub::Exporter 0.987 1641 | Sub::Exporter::Util 0.987 1642 | requirements: 1643 | Carp 0 1644 | Data::OptList 0.100 1645 | ExtUtils::MakeMaker 6.30 1646 | Params::Util 0.14 1647 | Sub::Install 0.92 1648 | strict 0 1649 | warnings 0 1650 | Sub-Exporter-Progressive-0.001013 1651 | pathname: F/FR/FREW/Sub-Exporter-Progressive-0.001013.tar.gz 1652 | provides: 1653 | Sub::Exporter::Progressive 0.001013 1654 | requirements: 1655 | ExtUtils::MakeMaker 0 1656 | Sub-Identify-0.14 1657 | pathname: R/RG/RGARCIA/Sub-Identify-0.14.tar.gz 1658 | provides: 1659 | Sub::Identify 0.14 1660 | requirements: 1661 | ExtUtils::MakeMaker 0 1662 | Test::More 0 1663 | Sub-Info-0.002 1664 | pathname: E/EX/EXODIST/Sub-Info-0.002.tar.gz 1665 | provides: 1666 | Sub::Info 0.002 1667 | requirements: 1668 | B 0 1669 | Carp 0 1670 | ExtUtils::MakeMaker 0 1671 | Importer 0.024 1672 | perl 5.008001 1673 | Sub-Install-0.928 1674 | pathname: R/RJ/RJBS/Sub-Install-0.928.tar.gz 1675 | provides: 1676 | Sub::Install 0.928 1677 | requirements: 1678 | B 0 1679 | Carp 0 1680 | ExtUtils::MakeMaker 6.30 1681 | Scalar::Util 0 1682 | strict 0 1683 | warnings 0 1684 | Sub-Name-0.26 1685 | pathname: E/ET/ETHER/Sub-Name-0.26.tar.gz 1686 | provides: 1687 | Sub::Name 0.26 1688 | requirements: 1689 | Exporter 0 1690 | ExtUtils::MakeMaker 0 1691 | XSLoader 0 1692 | perl 5.006 1693 | strict 0 1694 | warnings 0 1695 | Sub-Quote-2.006006 1696 | pathname: H/HA/HAARG/Sub-Quote-2.006006.tar.gz 1697 | provides: 1698 | Sub::Defer 2.006006 1699 | Sub::Quote 2.006006 1700 | requirements: 1701 | ExtUtils::MakeMaker 0 1702 | Scalar::Util 0 1703 | perl 5.006 1704 | Term-Table-0.015 1705 | pathname: E/EX/EXODIST/Term-Table-0.015.tar.gz 1706 | provides: 1707 | Term::Table 0.015 1708 | Term::Table::Cell 0.015 1709 | Term::Table::CellStack 0.015 1710 | Term::Table::HashBase 0.015 1711 | Term::Table::LineBreak 0.015 1712 | Term::Table::Spacer 0.015 1713 | Term::Table::Util 0.015 1714 | requirements: 1715 | Carp 0 1716 | ExtUtils::MakeMaker 0 1717 | Importer 0.024 1718 | List::Util 0 1719 | Scalar::Util 0 1720 | perl 5.008001 1721 | Test-Cmd-1.09 1722 | pathname: N/NE/NEILB/Test-Cmd-1.09.tar.gz 1723 | provides: 1724 | Test::Cmd 1.09 1725 | Test::Cmd::Common 1.09 1726 | requirements: 1727 | Cwd 0 1728 | Exporter 0 1729 | ExtUtils::MakeMaker 0 1730 | File::Basename 0 1731 | File::Copy 0 1732 | File::Find 0 1733 | File::Spec 0 1734 | perl 5.006 1735 | strict 0 1736 | warnings 0 1737 | Test-Compile-v2.4.1 1738 | pathname: E/EG/EGILES/Test-Compile-v2.4.1.tar.gz 1739 | provides: 1740 | Test::Compile v2.4.1 1741 | Test::Compile::Internal v2.4.1 1742 | requirements: 1743 | Exporter 5.68 1744 | Module::Build 0.38 1745 | UNIVERSAL::require 0 1746 | parent 0.225 1747 | perl v5.10.0 1748 | version 0 1749 | Test-Deep-1.130 1750 | pathname: R/RJ/RJBS/Test-Deep-1.130.tar.gz 1751 | provides: 1752 | Test::Deep 1.130 1753 | Test::Deep::All undef 1754 | Test::Deep::Any undef 1755 | Test::Deep::Array undef 1756 | Test::Deep::ArrayEach undef 1757 | Test::Deep::ArrayElementsOnly undef 1758 | Test::Deep::ArrayLength undef 1759 | Test::Deep::ArrayLengthOnly undef 1760 | Test::Deep::Blessed undef 1761 | Test::Deep::Boolean undef 1762 | Test::Deep::Cache undef 1763 | Test::Deep::Cache::Simple undef 1764 | Test::Deep::Class undef 1765 | Test::Deep::Cmp undef 1766 | Test::Deep::Code undef 1767 | Test::Deep::Hash undef 1768 | Test::Deep::HashEach undef 1769 | Test::Deep::HashElements undef 1770 | Test::Deep::HashKeys undef 1771 | Test::Deep::HashKeysOnly undef 1772 | Test::Deep::Ignore undef 1773 | Test::Deep::Isa undef 1774 | Test::Deep::ListMethods undef 1775 | Test::Deep::MM undef 1776 | Test::Deep::Methods undef 1777 | Test::Deep::NoTest undef 1778 | Test::Deep::None undef 1779 | Test::Deep::Number undef 1780 | Test::Deep::Obj undef 1781 | Test::Deep::Ref undef 1782 | Test::Deep::RefType undef 1783 | Test::Deep::Regexp undef 1784 | Test::Deep::RegexpMatches undef 1785 | Test::Deep::RegexpOnly undef 1786 | Test::Deep::RegexpRef undef 1787 | Test::Deep::RegexpRefOnly undef 1788 | Test::Deep::RegexpVersion undef 1789 | Test::Deep::ScalarRef undef 1790 | Test::Deep::ScalarRefOnly undef 1791 | Test::Deep::Set undef 1792 | Test::Deep::Shallow undef 1793 | Test::Deep::Stack undef 1794 | Test::Deep::String undef 1795 | Test::Deep::SubHash undef 1796 | Test::Deep::SubHashElements undef 1797 | Test::Deep::SubHashKeys undef 1798 | Test::Deep::SubHashKeysOnly undef 1799 | Test::Deep::SuperHash undef 1800 | Test::Deep::SuperHashElements undef 1801 | Test::Deep::SuperHashKeys undef 1802 | Test::Deep::SuperHashKeysOnly undef 1803 | requirements: 1804 | ExtUtils::MakeMaker 0 1805 | List::Util 1.09 1806 | Scalar::Util 1.09 1807 | Test::Builder 0 1808 | Test-Fatal-0.016 1809 | pathname: R/RJ/RJBS/Test-Fatal-0.016.tar.gz 1810 | provides: 1811 | Test::Fatal 0.016 1812 | requirements: 1813 | Carp 0 1814 | Exporter 5.57 1815 | ExtUtils::MakeMaker 0 1816 | Test::Builder 0 1817 | Try::Tiny 0.07 1818 | strict 0 1819 | warnings 0 1820 | Test-Pod-1.52 1821 | pathname: E/ET/ETHER/Test-Pod-1.52.tar.gz 1822 | provides: 1823 | Test::Pod 1.52 1824 | requirements: 1825 | ExtUtils::MakeMaker 0 1826 | File::Find 0 1827 | Pod::Simple 3.05 1828 | Test::Builder::Tester 1.02 1829 | Test::More 0.62 1830 | perl 5.008 1831 | Test-Pod-Coverage-1.10 1832 | pathname: N/NE/NEILB/Test-Pod-Coverage-1.10.tar.gz 1833 | provides: 1834 | Test::Pod::Coverage 1.10 1835 | requirements: 1836 | ExtUtils::MakeMaker 0 1837 | Pod::Coverage 0 1838 | Test::Builder 0 1839 | perl 5.006 1840 | strict 0 1841 | warnings 0 1842 | Test-Simple-1.302183 1843 | pathname: E/EX/EXODIST/Test-Simple-1.302183.tar.gz 1844 | provides: 1845 | Test2 1.302183 1846 | Test2::API 1.302183 1847 | Test2::API::Breakage 1.302183 1848 | Test2::API::Context 1.302183 1849 | Test2::API::Instance 1.302183 1850 | Test2::API::InterceptResult 1.302183 1851 | Test2::API::InterceptResult::Event 1.302183 1852 | Test2::API::InterceptResult::Facet 1.302183 1853 | Test2::API::InterceptResult::Hub 1.302183 1854 | Test2::API::InterceptResult::Squasher 1.302183 1855 | Test2::API::Stack 1.302183 1856 | Test2::Event 1.302183 1857 | Test2::Event::Bail 1.302183 1858 | Test2::Event::Diag 1.302183 1859 | Test2::Event::Encoding 1.302183 1860 | Test2::Event::Exception 1.302183 1861 | Test2::Event::Fail 1.302183 1862 | Test2::Event::Generic 1.302183 1863 | Test2::Event::Note 1.302183 1864 | Test2::Event::Ok 1.302183 1865 | Test2::Event::Pass 1.302183 1866 | Test2::Event::Plan 1.302183 1867 | Test2::Event::Skip 1.302183 1868 | Test2::Event::Subtest 1.302183 1869 | Test2::Event::TAP::Version 1.302183 1870 | Test2::Event::V2 1.302183 1871 | Test2::Event::Waiting 1.302183 1872 | Test2::EventFacet 1.302183 1873 | Test2::EventFacet::About 1.302183 1874 | Test2::EventFacet::Amnesty 1.302183 1875 | Test2::EventFacet::Assert 1.302183 1876 | Test2::EventFacet::Control 1.302183 1877 | Test2::EventFacet::Error 1.302183 1878 | Test2::EventFacet::Hub 1.302183 1879 | Test2::EventFacet::Info 1.302183 1880 | Test2::EventFacet::Info::Table 1.302183 1881 | Test2::EventFacet::Meta 1.302183 1882 | Test2::EventFacet::Parent 1.302183 1883 | Test2::EventFacet::Plan 1.302183 1884 | Test2::EventFacet::Render 1.302183 1885 | Test2::EventFacet::Trace 1.302183 1886 | Test2::Formatter 1.302183 1887 | Test2::Formatter::TAP 1.302183 1888 | Test2::Hub 1.302183 1889 | Test2::Hub::Interceptor 1.302183 1890 | Test2::Hub::Interceptor::Terminator 1.302183 1891 | Test2::Hub::Subtest 1.302183 1892 | Test2::IPC 1.302183 1893 | Test2::IPC::Driver 1.302183 1894 | Test2::IPC::Driver::Files 1.302183 1895 | Test2::Tools::Tiny 1.302183 1896 | Test2::Util 1.302183 1897 | Test2::Util::ExternalMeta 1.302183 1898 | Test2::Util::Facets2Legacy 1.302183 1899 | Test2::Util::HashBase 1.302183 1900 | Test2::Util::Trace 1.302183 1901 | Test::Builder 1.302183 1902 | Test::Builder::Formatter 1.302183 1903 | Test::Builder::IO::Scalar 2.114 1904 | Test::Builder::Module 1.302183 1905 | Test::Builder::Tester 1.302183 1906 | Test::Builder::Tester::Color 1.302183 1907 | Test::Builder::Tester::Tie 1.302183 1908 | Test::Builder::TodoDiag 1.302183 1909 | Test::More 1.302183 1910 | Test::Simple 1.302183 1911 | Test::Tester 1.302183 1912 | Test::Tester::Capture 1.302183 1913 | Test::Tester::CaptureRunner 1.302183 1914 | Test::Tester::Delegate 1.302183 1915 | Test::use::ok 1.302183 1916 | ok 1.302183 1917 | requirements: 1918 | ExtUtils::MakeMaker 0 1919 | File::Spec 0 1920 | File::Temp 0 1921 | Scalar::Util 1.13 1922 | Storable 0 1923 | perl 5.006002 1924 | utf8 0 1925 | Test2-Suite-0.000138 1926 | pathname: E/EX/EXODIST/Test2-Suite-0.000138.tar.gz 1927 | provides: 1928 | Test2::AsyncSubtest 0.000138 1929 | Test2::AsyncSubtest::Event::Attach 0.000138 1930 | Test2::AsyncSubtest::Event::Detach 0.000138 1931 | Test2::AsyncSubtest::Formatter 0.000138 1932 | Test2::AsyncSubtest::Hub 0.000138 1933 | Test2::Bundle 0.000138 1934 | Test2::Bundle::Extended 0.000138 1935 | Test2::Bundle::More 0.000138 1936 | Test2::Bundle::Simple 0.000138 1937 | Test2::Compare 0.000138 1938 | Test2::Compare::Array 0.000138 1939 | Test2::Compare::Bag 0.000138 1940 | Test2::Compare::Base 0.000138 1941 | Test2::Compare::Bool 0.000138 1942 | Test2::Compare::Custom 0.000138 1943 | Test2::Compare::DeepRef 0.000138 1944 | Test2::Compare::Delta 0.000138 1945 | Test2::Compare::Event 0.000138 1946 | Test2::Compare::EventMeta 0.000138 1947 | Test2::Compare::Float 0.000138 1948 | Test2::Compare::Hash 0.000138 1949 | Test2::Compare::Meta 0.000138 1950 | Test2::Compare::Negatable 0.000138 1951 | Test2::Compare::Number 0.000138 1952 | Test2::Compare::Object 0.000138 1953 | Test2::Compare::OrderedSubset 0.000138 1954 | Test2::Compare::Pattern 0.000138 1955 | Test2::Compare::Ref 0.000138 1956 | Test2::Compare::Regex 0.000138 1957 | Test2::Compare::Scalar 0.000138 1958 | Test2::Compare::Set 0.000138 1959 | Test2::Compare::String 0.000138 1960 | Test2::Compare::Undef 0.000138 1961 | Test2::Compare::Wildcard 0.000138 1962 | Test2::Manual 0.000138 1963 | Test2::Manual::Anatomy 0.000138 1964 | Test2::Manual::Anatomy::API 0.000138 1965 | Test2::Manual::Anatomy::Context 0.000138 1966 | Test2::Manual::Anatomy::EndToEnd 0.000138 1967 | Test2::Manual::Anatomy::Event 0.000138 1968 | Test2::Manual::Anatomy::Hubs 0.000138 1969 | Test2::Manual::Anatomy::IPC 0.000138 1970 | Test2::Manual::Anatomy::Utilities 0.000138 1971 | Test2::Manual::Contributing 0.000138 1972 | Test2::Manual::Testing 0.000138 1973 | Test2::Manual::Testing::Introduction 0.000138 1974 | Test2::Manual::Testing::Migrating 0.000138 1975 | Test2::Manual::Testing::Planning 0.000138 1976 | Test2::Manual::Testing::Todo 0.000138 1977 | Test2::Manual::Tooling 0.000138 1978 | Test2::Manual::Tooling::FirstTool 0.000138 1979 | Test2::Manual::Tooling::Formatter 0.000138 1980 | Test2::Manual::Tooling::Nesting 0.000138 1981 | Test2::Manual::Tooling::Plugin::TestExit 0.000138 1982 | Test2::Manual::Tooling::Plugin::TestingDone 0.000138 1983 | Test2::Manual::Tooling::Plugin::ToolCompletes 0.000138 1984 | Test2::Manual::Tooling::Plugin::ToolStarts 0.000138 1985 | Test2::Manual::Tooling::Subtest 0.000138 1986 | Test2::Manual::Tooling::TestBuilder 0.000138 1987 | Test2::Manual::Tooling::Testing 0.000138 1988 | Test2::Mock 0.000138 1989 | Test2::Plugin 0.000138 1990 | Test2::Plugin::BailOnFail 0.000138 1991 | Test2::Plugin::DieOnFail 0.000138 1992 | Test2::Plugin::ExitSummary 0.000138 1993 | Test2::Plugin::SRand 0.000138 1994 | Test2::Plugin::Times 0.000138 1995 | Test2::Plugin::UTF8 0.000138 1996 | Test2::Require 0.000138 1997 | Test2::Require::AuthorTesting 0.000138 1998 | Test2::Require::EnvVar 0.000138 1999 | Test2::Require::Fork 0.000138 2000 | Test2::Require::Module 0.000138 2001 | Test2::Require::Perl 0.000138 2002 | Test2::Require::RealFork 0.000138 2003 | Test2::Require::Threads 0.000138 2004 | Test2::Suite 0.000138 2005 | Test2::Todo 0.000138 2006 | Test2::Tools 0.000138 2007 | Test2::Tools::AsyncSubtest 0.000138 2008 | Test2::Tools::Basic 0.000138 2009 | Test2::Tools::Class 0.000138 2010 | Test2::Tools::ClassicCompare 0.000138 2011 | Test2::Tools::Compare 0.000138 2012 | Test2::Tools::Defer 0.000138 2013 | Test2::Tools::Encoding 0.000138 2014 | Test2::Tools::Event 0.000138 2015 | Test2::Tools::Exception 0.000138 2016 | Test2::Tools::Exports 0.000138 2017 | Test2::Tools::GenTemp 0.000138 2018 | Test2::Tools::Grab 0.000138 2019 | Test2::Tools::Mock 0.000138 2020 | Test2::Tools::Ref 0.000138 2021 | Test2::Tools::Spec 0.000138 2022 | Test2::Tools::Subtest 0.000138 2023 | Test2::Tools::Target 0.000138 2024 | Test2::Tools::Tester 0.000138 2025 | Test2::Tools::Warnings 0.000138 2026 | Test2::Util::Grabber 0.000138 2027 | Test2::Util::Ref 0.000138 2028 | Test2::Util::Stash 0.000138 2029 | Test2::Util::Sub 0.000138 2030 | Test2::Util::Table 0.000138 2031 | Test2::Util::Table::Cell 0.000138 2032 | Test2::Util::Table::LineBreak 0.000138 2033 | Test2::Util::Term 0.000138 2034 | Test2::Util::Times 0.000138 2035 | Test2::V0 0.000138 2036 | Test2::Workflow 0.000138 2037 | Test2::Workflow::BlockBase 0.000138 2038 | Test2::Workflow::Build 0.000138 2039 | Test2::Workflow::Runner 0.000138 2040 | Test2::Workflow::Task 0.000138 2041 | Test2::Workflow::Task::Action 0.000138 2042 | Test2::Workflow::Task::Group 0.000138 2043 | requirements: 2044 | B 0 2045 | Carp 0 2046 | Data::Dumper 0 2047 | Exporter 0 2048 | ExtUtils::MakeMaker 0 2049 | Importer 0.024 2050 | Module::Pluggable 2.7 2051 | Scalar::Util 0 2052 | Scope::Guard 0 2053 | Sub::Info 0.002 2054 | Term::Table 0.013 2055 | Test2::API 1.302176 2056 | Time::HiRes 0 2057 | overload 0 2058 | perl 5.008001 2059 | utf8 0 2060 | Text-Aligner-0.16 2061 | pathname: S/SH/SHLOMIF/Text-Aligner-0.16.tar.gz 2062 | provides: 2063 | Text::Aligner 0.16 2064 | Text::Aligner::Auto 0.16 2065 | Text::Aligner::MaxKeeper 0.16 2066 | requirements: 2067 | Exporter 0 2068 | ExtUtils::MakeMaker 0 2069 | Module::Build 0.28 2070 | Term::ANSIColor 2.02 2071 | perl 5.008 2072 | strict 0 2073 | vars 0 2074 | warnings 0 2075 | Text-Diff-1.45 2076 | pathname: N/NE/NEILB/Text-Diff-1.45.tar.gz 2077 | provides: 2078 | Text::Diff 1.45 2079 | Text::Diff::Base 1.45 2080 | Text::Diff::Config 1.44 2081 | Text::Diff::Table 1.44 2082 | requirements: 2083 | Algorithm::Diff 1.19 2084 | Exporter 0 2085 | ExtUtils::MakeMaker 0 2086 | perl 5.006 2087 | Text-Glob-0.11 2088 | pathname: R/RC/RCLAMP/Text-Glob-0.11.tar.gz 2089 | provides: 2090 | Text::Glob 0.11 2091 | requirements: 2092 | Exporter 0 2093 | ExtUtils::MakeMaker 0 2094 | constant 0 2095 | perl 5.00503 2096 | Time-Duration-Parse-0.15 2097 | pathname: N/NE/NEILB/Time-Duration-Parse-0.15.tar.gz 2098 | provides: 2099 | Time::Duration::Parse 0.15 2100 | requirements: 2101 | Carp 0 2102 | Exporter::Lite 0 2103 | ExtUtils::MakeMaker 0 2104 | perl 5.006 2105 | strict 0 2106 | warnings 0 2107 | TimeDate-2.33 2108 | pathname: A/AT/ATOOMIC/TimeDate-2.33.tar.gz 2109 | provides: 2110 | Date::Format 2.24 2111 | Date::Format::Generic 2.24 2112 | Date::Language 1.10 2113 | Date::Language::Afar 0.99 2114 | Date::Language::Amharic 1.00 2115 | Date::Language::Austrian 1.01 2116 | Date::Language::Brazilian 1.01 2117 | Date::Language::Bulgarian 1.01 2118 | Date::Language::Chinese 1.00 2119 | Date::Language::Chinese_GB 1.01 2120 | Date::Language::Czech 1.01 2121 | Date::Language::Danish 1.01 2122 | Date::Language::Dutch 1.02 2123 | Date::Language::English 1.01 2124 | Date::Language::Finnish 1.01 2125 | Date::Language::French 1.04 2126 | Date::Language::Gedeo 0.99 2127 | Date::Language::German 1.02 2128 | Date::Language::Greek 1.00 2129 | Date::Language::Hungarian 1.01 2130 | Date::Language::Icelandic 1.01 2131 | Date::Language::Italian 1.01 2132 | Date::Language::Norwegian 1.01 2133 | Date::Language::Occitan 1.04 2134 | Date::Language::Oromo 0.99 2135 | Date::Language::Romanian 1.01 2136 | Date::Language::Russian 1.01 2137 | Date::Language::Russian_cp1251 1.01 2138 | Date::Language::Russian_koi8r 1.01 2139 | Date::Language::Sidama 0.99 2140 | Date::Language::Somali 0.99 2141 | Date::Language::Spanish 1.00 2142 | Date::Language::Swedish 1.01 2143 | Date::Language::Tigrinya 1.00 2144 | Date::Language::TigrinyaEritrean 1.00 2145 | Date::Language::TigrinyaEthiopian 1.00 2146 | Date::Language::Turkish 1.0 2147 | Date::Parse 2.33 2148 | Time::Zone 2.24 2149 | TimeDate 1.21 2150 | requirements: 2151 | ExtUtils::MakeMaker 0 2152 | Try-Tiny-0.30 2153 | pathname: E/ET/ETHER/Try-Tiny-0.30.tar.gz 2154 | provides: 2155 | Try::Tiny 0.30 2156 | requirements: 2157 | Carp 0 2158 | Exporter 5.57 2159 | ExtUtils::MakeMaker 0 2160 | constant 0 2161 | perl 5.006 2162 | strict 0 2163 | warnings 0 2164 | UNIVERSAL-require-0.18 2165 | pathname: N/NE/NEILB/UNIVERSAL-require-0.18.tar.gz 2166 | provides: 2167 | UNIVERSAL::require 0.18 2168 | requirements: 2169 | Carp 0 2170 | ExtUtils::MakeMaker 0 2171 | Test::More 0.47 2172 | perl 5.006 2173 | strict 0 2174 | warnings 0 2175 | XString-0.005 2176 | pathname: A/AT/ATOOMIC/XString-0.005.tar.gz 2177 | provides: 2178 | XString 0.005 2179 | requirements: 2180 | ExtUtils::MakeMaker 0 2181 | perl 5.008 2182 | common-sense-3.75 2183 | pathname: M/ML/MLEHMANN/common-sense-3.75.tar.gz 2184 | provides: 2185 | common::sense 3.75 2186 | requirements: 2187 | ExtUtils::MakeMaker 0 2188 | -------------------------------------------------------------------------------- /scripts/pdi-build-deps: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use strict; 4 | use warnings; 5 | use Getopt::Long; 6 | 7 | ################################################ 8 | # Usage 9 | 10 | sub usage { 11 | die <] [] 13 | 14 | Uses the cpanfile (and cpanfile.snapshot, if present) files to install 15 | the Perl dependencies we need. 16 | 17 | You can use a different name ('cpanfile' is only the default) by passing 18 | along the file as a parameter (the in the usage above). 19 | 20 | This script supports two modes: 21 | 22 | * app dependencies (the default): installed under /deps; 23 | * stack dependencies: installed under /stack 24 | 25 | The default is to install app dependencies, use --stack to install stack 26 | dependencies. 27 | 28 | You can also use layers, sets of cpanfile/cpanfile.snapshots that can 29 | be placed at /deps/layers/. These can be installed with 30 | the --layer=X option. 31 | 32 | 33 | Options: 34 | 35 | --help, -? This message 36 | --root=path Destination for our installs (default /deps) 37 | 38 | --stack Install dependencies for the stack 39 | --layer=X Install dependencies for layer X 40 | --skip-snapshot Ignore the cpanfile.snapshot, even if present 41 | 42 | --all Installl dependencies for all phases. By default 43 | we will skip suggests, configure, and develop 44 | EOU 45 | } 46 | 47 | 48 | ################################################ 49 | # Main logic 50 | 51 | ### Parse our options and deal with bad ones or --help 52 | my $ok = GetOptions(\my %opts, 'root=s', 'stack', 'skip-snapshot', 'all', 'verbose', 'layer=s', 'help|?'); 53 | usage() unless $ok; 54 | usage() if $opts{help}; 55 | 56 | my $cpanfile = $ARGV[0] || 'cpanfile'; 57 | my $snapshot = "${cpanfile}.snapshot"; 58 | my $root_dir = $opts{root} || '/deps'; 59 | 60 | ### Layer support: use layer-specific cpanfile's 61 | if (my $layer = $opts{layer}) { 62 | my $dir = "$root_dir/layers/$layer"; 63 | die "FATAL: --layer requires $dir to exist with cpanfile for layer deps\n" unless -e "$dir/cpanfile"; 64 | 65 | $cpanfile = 'cpanfile'; 66 | $snapshot = 'cpanfile.snapshot'; 67 | $opts{all} = 1; 68 | delete $opts{stack}; 69 | chdir($dir); 70 | } 71 | 72 | ### We need at least the cpanfile 73 | die "FATAL: no '$cpanfile' file found\n" if $cpanfile ne '.' and not -e $cpanfile; 74 | 75 | 76 | ### Try to use a dynamic number of workers based on the server available CPUs 77 | my $workers = 4; ## the CPM default 78 | my $cpuinfo = do { local $/; open(my $fh, '<', '/proc/cpuinfo'); <$fh> }; 79 | if ($cpuinfo) { 80 | my @cores = $cpuinfo =~ m/^(processor)\s*:\s*\d+$/gsm; 81 | $workers = @cores * 2; 82 | } 83 | 84 | 85 | ### Prepare our cmds, decide on final deployment or just recreate the snapshot 86 | my @cpm_cmd = ('cpm', 'install', '--workers', $workers, '--no-prebuilt', '--no-test', '--show-build-log-on-failure'); 87 | push @cpm_cmd, '--mirror', '/mirror', '--resolver', '02packages,/mirror', '--resolver', 'metadb' if -d '/mirror'; 88 | push @cpm_cmd, '--verbose' if $opts{verbose}; 89 | 90 | my @carton_cmd = ('carton', 'install'); 91 | push @carton_cmd, '--deployment' unless $opts{'skip-snapshot'} or not -e $snapshot; 92 | 93 | if ($opts{all}) { 94 | push @cpm_cmd, '--with-develop', '--with-configure', '--with-suggests'; 95 | } 96 | else { 97 | push @cpm_cmd, '--without-develop', '--without-configure', '--without-suggests'; 98 | push @carton_cmd, '--without', 'develop,configure,suggests'; 99 | } 100 | 101 | 102 | ### Destination dir for deps depends on app or stack mode 103 | my $deps_dir = $opts{root} ? $root_dir : $opts{stack} ? '/stack' : $root_dir; 104 | push @cpm_cmd, '-L', "$deps_dir/local/"; 105 | 106 | ### Prepare the cpanfiles required 107 | if ($cpanfile ne '.') { 108 | system('/bin/cp', $cpanfile, "$deps_dir/cpanfile"); 109 | if (-e $snapshot and !$opts{'skip-snapshot'}) { system('/bin/cp', $snapshot, "$deps_dir/cpanfile.snapshot") } 110 | else { system('/bin/rm', '-f', "$deps_dir/cpanfile.snapshot") } 111 | chdir($deps_dir); 112 | } 113 | else { push @cpm_cmd, '.' } 114 | 115 | 116 | ### Take care of running cpm to install eveything, first time with felling 117 | print "\n\n*** First run - install stuff using '@cpm_cmd'\n\n"; 118 | my $error = run_cmd(@cpm_cmd); 119 | 120 | if ($error) { 121 | print "\n\n*** ERROR End of build.log file\n\n"; 122 | exit(1); 123 | } 124 | 125 | 126 | ### All is well with the world, so lets use Carton to generate the 127 | ### cpanfile.snapshot -- please note that we only do this if 128 | ### --skip-snapshot if used, because in that case we don't use the snapshot, 129 | ### we want to recreate it 130 | 131 | if ($opts{'skip-snapshot'}) { 132 | print "\n*** Running Carton to generate cpanfile.snapshot: '@carton_cmd'\n\n"; 133 | $error = run_cmd(@carton_cmd); 134 | if ($error) { 135 | print "\n\n*** ERROR: command exit code $ok, dumping log file:\n\n"; 136 | system('/bin/cat', "$ENV{HOME}/.cpanm/build.log"); 137 | print "\n\n*** End of build.log file\n\n"; 138 | exit(1); 139 | } 140 | } 141 | 142 | 143 | ### Final cleanup 144 | print "\n\n*** Deps instalation complete, cleaning up...\n\n"; 145 | exec('/bin/rm', '-rf', 'local/cache', "$ENV{HOME}/.cpanm*", "$ENV{HOME}/.perl-cpm"); 146 | die "FATAL: failed to exec() '/bin/rm': $!"; 147 | 148 | 149 | ################################################ 150 | # Helpers 151 | 152 | sub run_cmd { 153 | system(@_); 154 | return 0 if $? == 0; 155 | return $? >> 8; 156 | } 157 | -------------------------------------------------------------------------------- /scripts/pdi-cpanfile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use strict; 4 | use Path::Tiny; 5 | use Getopt::Long; 6 | use Module::CPANfile; 7 | use CPAN::Meta::Prereqs; 8 | 9 | ### What does this thing do?? 10 | 11 | sub usage { 12 | print STDERR "ERROR: @_\n" if @_; 13 | 14 | print STDERR < [options] 16 | 17 | Tools to manipulate project CPANfiles 18 | 19 | For now three 's are available: 20 | 21 | * list: lists all cpanfile's, recursively 22 | * merge: generates to stdout a single cpanfile - very primitive algorithm for now 23 | * install: install all deps, using pdi-install-deps 24 | 25 | EOU 26 | 27 | exit(1); 28 | } 29 | 30 | 31 | ### Command line parsing 32 | 33 | my ($root_opt, $help_opt); 34 | 35 | GetOptions('root=s' => \$root_opt, 'help|?' => \$help_opt) or usage(); 36 | usage() if $help_opt; 37 | 38 | my $cmd = shift @ARGV; 39 | usage('a command is required') unless length($cmd); 40 | 41 | command_dispatch($cmd); 42 | exit(0); 43 | 44 | 45 | ### Command dispatch 46 | 47 | sub run (&;$) { 48 | my $p = $_[1] || '/app'; 49 | return $_[0]->(path($p)); 50 | } 51 | 52 | sub command_dispatch { 53 | my ($cmd) = @_; 54 | 55 | if ($cmd eq 'list') { 56 | run { print "$_\n" for _find_cpanfiles($_[0]) } $root_opt; 57 | } 58 | elsif ($cmd eq 'merge') { 59 | run { print _merge_cpanfile($_[0]) } $root_opt; 60 | } 61 | elsif ($cmd eq 'install') { 62 | run { 63 | my $tmp = Path::Tiny->tempfile; 64 | $tmp->spew(_merge_cpanfile($_[0])); 65 | 66 | delete $ENV{LANG}; 67 | exec('/usr/bin/pdi-build-deps', '--skip-snapshot', @ARGV, $tmp->stringify); 68 | } 69 | $root_opt; 70 | } 71 | else { 72 | usage("invalid command '$cmd'"); 73 | } 74 | } 75 | 76 | 77 | #### Utils 78 | 79 | sub _find_cpanfiles { 80 | my ($root) = @_; 81 | my $i = $root->iterator({ recurse => 1 }); 82 | 83 | my @found; 84 | while (my $f = $i->()) { 85 | next unless $f->basename =~ m/.*cpanfile$/; ## no point going on if we don't have cpanfile on our name... 86 | 87 | my $r = $f->relative($root); 88 | next if $r =~ m{^local/}; ## skip Carton install dir 89 | next if $r =~ m{^.docker-perl-local/}; ## skip Carton install dir via melopt/perl-alt setup 90 | next if $r =~ m{^.git/}; ## skip git dir also 91 | 92 | push @found, $f; 93 | } 94 | 95 | return wantarray ? @found : \@found; 96 | } 97 | 98 | sub _merge_cpanfile { 99 | my ($root) = @_; 100 | 101 | # FIXME: the files we found might not be valid cpanfiles... how to test for that? 102 | # first attempt, restrict the name of the files 103 | my @cpanfiles = grep { $_->basename eq 'cpanfile' or $_->basename =~ m/\Q.cpanfile\E$/ } _find_cpanfiles($root); 104 | my @prereqs = map { Module::CPANfile->load($_)->prereqs } @cpanfiles; 105 | my $reqs = CPAN::Meta::Prereqs->new->with_merged_prereqs(\@prereqs); 106 | 107 | my $header = join("\n", 108 | '### *** DO NOT EDIT *** GENERATED AUTOMATICALY BY orc-cpanfile ***', 109 | '###', 110 | '### Merge of the following cpanfiles', 111 | map {"### * $_"} map { $_->relative($root) } @cpanfiles, 112 | ); 113 | 114 | return "$header\n\n" . Module::CPANfile->from_prereqs($reqs->as_string_hash)->to_string; 115 | } 116 | -------------------------------------------------------------------------------- /scripts/pdi-entrypoint: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # Default entrypoint script 4 | # 5 | 6 | use strict; 7 | use warnings; 8 | use autodie; 9 | use Path::Tiny; 10 | use Config; 11 | 12 | ## Update the CPAN deps if PDI_UPDATE_DEPS is present 13 | system('/usr/bin/pdi-build-deps') if $ENV{PDI_UPDATE_DEPS}; 14 | 15 | ## Collect folders for PERL5LIB 16 | my @incs = ('/app/lib'); 17 | 18 | ## Search for submodules 19 | my $base = path('/app/elib'); 20 | if ($base->is_dir) { 21 | for my $sm ($base->children) { 22 | my $sml = $sm->child('lib'); 23 | next unless $sml->is_dir; 24 | 25 | push @incs, $sml->stringify; 26 | } 27 | } 28 | 29 | ## Add deps 30 | for my $d ('/deps', '/stack') { 31 | for my $s ('lib', 'local/lib/perl5', "local/lib/perl5/$Config{'archname'}") { 32 | push @incs, "$d/$s" if -d "$d/$s"; 33 | } 34 | } 35 | 36 | ## Generate final PERL5LIB 37 | $ENV{PERL5LIB} = join(':', grep {$_} (@incs, $ENV{PERL5LIB})); 38 | 39 | ## Per project entrypoint support :) 40 | my @entrypoint; 41 | push @entrypoint, '/entrypoint' if -x '/entrypoint'; 42 | 43 | ## Lambda support! 44 | my $lambda_handlers = path('/app/lambda-handlers'); 45 | 46 | my $lambda_env_type = running_in_lambda($lambda_handlers, @ARGV); 47 | if ($lambda_env_type) { 48 | my $lambda_runtime = path($ENV{LAMBDA_RUNTIME_DIR} || '/var/runtime'); 49 | 50 | $ENV{PDI_LAMBDA_ENV_TYPE} = $lambda_env_type; 51 | $ENV{LAMBDA_TASK_ROOT} = "$lambda_handlers"; 52 | $ENV{LAMBDA_RUNTIME_DIR} = "$lambda_runtime"; 53 | 54 | push @entrypoint, '/usr/local/bin/aws-lambda-rie' if $lambda_env_type eq 'rie'; 55 | push @entrypoint, $lambda_runtime->child('bootstrap')->stringify; 56 | } 57 | 58 | ## Exec the command 59 | if (@ARGV) { 60 | exec(@entrypoint, @ARGV); 61 | die "FATAL: failed to exec '@ARGV': $!\n"; 62 | } 63 | 64 | for ('/bin/bash', '/bin/sh') { exec(@entrypoint, $_) if -x } 65 | die "FATAL: could not find any shell!!!\n"; 66 | 67 | 68 | ############################################## 69 | #### Detect if we are and can run under lambda 70 | sub running_in_lambda { 71 | my (undef, $cmd) = @_; 72 | my $has_handler = check_for_lambda_handlers(@_); 73 | 74 | if ($ENV{AWS_LAMBDA_RUNTIME_API}) { 75 | die "FATAL: ENV AWS_LAMBDA_RUNTIME_API set, but handler script '$cmd' not found\n" unless $has_handler; 76 | return 'aws'; 77 | } 78 | return 'rie' if $ENV{PDI_LAMBDA_EMULATOR}; 79 | return 'rie' if $has_handler; 80 | 81 | return; 82 | } 83 | 84 | sub check_for_lambda_handlers { 85 | my ($lambda_handlers, $cmd) = @_; 86 | return unless $lambda_handlers->is_dir; 87 | return unless @_ == 2 and $cmd =~ m/^(.+?)\.(.+)/ and $lambda_handlers->child("$1.pl")->exists; 88 | 89 | return 1; 90 | } 91 | -------------------------------------------------------------------------------- /scripts/pdi-perl-env: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # Default entrypoint script 4 | # 5 | 6 | use strict; 7 | use warnings; 8 | use Path::Tiny; 9 | 10 | ## Search for submodules 11 | my $base = path('/app/elib'); 12 | if ($base->is_dir) { 13 | my @incs = ('/app/lib'); 14 | for my $sm ($base->children) { 15 | my $sml = $sm->child('lib'); 16 | next unless $sml->is_dir; 17 | 18 | push @incs, $sml->stringify; 19 | } 20 | 21 | $ENV{PERL5LIB} = join(':', @incs, $ENV{PERL5LIB}) if @incs; 22 | } 23 | 24 | print qq{PERL5LIB='$ENV{PERL5LIB}'\nexport PERL5LIB\n}; 25 | 26 | -------------------------------------------------------------------------------- /scripts/pdi-run-tests: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | # 3 | # Check all Perl scripts under /app/bin and run tests 4 | # 5 | 6 | use strict; 7 | use Path::Tiny; 8 | 9 | my $app = path('/app'); 10 | chdir($app) or exit(0); 11 | 12 | for my $folder (qw( bin sbin ), 'lambda-handlers') { 13 | my $bin = $app->child($folder); 14 | next unless $bin->is_dir; 15 | 16 | my $bin_it = $bin->iterator; 17 | while (my $f = $bin_it->()) { 18 | next unless -x "$f"; 19 | next unless $f->slurp =~ m/^#!.+perl/; 20 | 21 | system($^X, '-I/app/lib', '-wc', "$f") and fatal("Failed to check script '$f'"); 22 | } 23 | } 24 | 25 | my $t = $app->child('t'); 26 | if ($t->is_dir) { 27 | my @folders = ($t); 28 | if (not $t->child('.pdi-run-tests-ok')->is_file) { 29 | @folders = grep { $_->is_dir and $_->child('.pdi-run-tests-ok')->is_file } $t->children; 30 | } 31 | system('prove', '-vr', '-I/app/lib', @folders) and fatal('Failed tests, check them') if @folders; 32 | } 33 | 34 | exit(0); 35 | 36 | 37 | ######################## 38 | # Utilities 39 | 40 | sub fatal { 41 | print "\n\n***** $@\n\n"; 42 | sleep(2); 43 | exit(1); 44 | } 45 | -------------------------------------------------------------------------------- /test/basic/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG BASE=perl-latest-devel 2 | FROM melopt/perl-alt:${BASE} 3 | 4 | RUN pdi-build-deps --layer=devel 5 | COPY cpanfile* /app/ 6 | RUN pdi-build-deps 7 | 8 | COPY t/ /app/t/ 9 | RUN mkdir -p /app/elib/x/lib 10 | -------------------------------------------------------------------------------- /test/basic/cpanfile: -------------------------------------------------------------------------------- 1 | requires 'HTTP::Tiny', '0.076'; 2 | requires 'IO::Socket::SSL', '2.068'; 3 | requires 'JSON::MaybeXS', '1.004002'; 4 | requires 'Test2::Suite'; -------------------------------------------------------------------------------- /test/basic/cpanfile.snapshot: -------------------------------------------------------------------------------- 1 | # carton snapshot format: version 1.0 2 | DISTRIBUTIONS 3 | Cpanel-JSON-XS-4.25 4 | pathname: R/RU/RURBAN/Cpanel-JSON-XS-4.25.tar.gz 5 | provides: 6 | Cpanel::JSON::XS 4.25 7 | Cpanel::JSON::XS::Type undef 8 | requirements: 9 | Carp 0 10 | Config 0 11 | Encode 1.9801 12 | Exporter 0 13 | ExtUtils::MakeMaker 0 14 | Pod::Text 2.08 15 | XSLoader 0 16 | overload 0 17 | strict 0 18 | warnings 0 19 | HTTP-Tiny-0.076 20 | pathname: D/DA/DAGOLDEN/HTTP-Tiny-0.076.tar.gz 21 | provides: 22 | HTTP::Tiny 0.076 23 | requirements: 24 | Carp 0 25 | ExtUtils::MakeMaker 6.17 26 | Fcntl 0 27 | IO::Socket 0 28 | MIME::Base64 0 29 | Socket 0 30 | Time::Local 0 31 | bytes 0 32 | perl 5.006 33 | strict 0 34 | warnings 0 35 | IO-Socket-SSL-2.068 36 | pathname: S/SU/SULLR/IO-Socket-SSL-2.068.tar.gz 37 | provides: 38 | IO::Socket::SSL 2.068 39 | IO::Socket::SSL::Intercept 2.056 40 | IO::Socket::SSL::OCSP_Cache 2.068 41 | IO::Socket::SSL::OCSP_Resolver 2.068 42 | IO::Socket::SSL::PublicSuffix undef 43 | IO::Socket::SSL::SSL_Context 2.068 44 | IO::Socket::SSL::SSL_HANDLE 2.068 45 | IO::Socket::SSL::Session_Cache 2.068 46 | IO::Socket::SSL::Utils 2.014 47 | requirements: 48 | ExtUtils::MakeMaker 0 49 | Mozilla::CA 0 50 | Net::SSLeay 1.46 51 | Scalar::Util 0 52 | Importer-0.026 53 | pathname: E/EX/EXODIST/Importer-0.026.tar.gz 54 | provides: 55 | Importer 0.026 56 | requirements: 57 | ExtUtils::MakeMaker 0 58 | perl 5.008001 59 | JSON-MaybeXS-1.004002 60 | pathname: E/ET/ETHER/JSON-MaybeXS-1.004002.tar.gz 61 | provides: 62 | JSON::MaybeXS 1.004002 63 | requirements: 64 | Carp 0 65 | Cpanel::JSON::XS 2.3310 66 | ExtUtils::MakeMaker 0 67 | JSON::PP 2.27300 68 | Scalar::Util 0 69 | perl 5.006 70 | Module-Pluggable-5.2 71 | pathname: S/SI/SIMONW/Module-Pluggable-5.2.tar.gz 72 | provides: 73 | Devel::InnerPackage 0.4 74 | Module::Pluggable 5.2 75 | Module::Pluggable::Object 5.2 76 | requirements: 77 | Exporter 5.57 78 | ExtUtils::MakeMaker 0 79 | File::Basename 0 80 | File::Find 0 81 | File::Spec 3.00 82 | File::Spec::Functions 0 83 | if 0 84 | perl 5.00503 85 | strict 0 86 | Mozilla-CA-20200520 87 | pathname: A/AB/ABH/Mozilla-CA-20200520.tar.gz 88 | provides: 89 | Mozilla::CA 20200520 90 | requirements: 91 | ExtUtils::MakeMaker 0 92 | Test 0 93 | perl 5.006 94 | Net-SSLeay-1.88 95 | pathname: C/CH/CHRISN/Net-SSLeay-1.88.tar.gz 96 | provides: 97 | Net::SSLeay 1.88 98 | Net::SSLeay::Handle 1.88 99 | requirements: 100 | ExtUtils::MakeMaker 0 101 | MIME::Base64 0 102 | perl 5.008001 103 | Scope-Guard-0.21 104 | pathname: C/CH/CHOCOLATE/Scope-Guard-0.21.tar.gz 105 | provides: 106 | Scope::Guard 0.21 107 | requirements: 108 | ExtUtils::MakeMaker 0 109 | Test::More 0 110 | perl 5.006001 111 | Sub-Info-0.002 112 | pathname: E/EX/EXODIST/Sub-Info-0.002.tar.gz 113 | provides: 114 | Sub::Info 0.002 115 | requirements: 116 | B 0 117 | Carp 0 118 | ExtUtils::MakeMaker 0 119 | Importer 0.024 120 | perl 5.008001 121 | Term-Table-0.015 122 | pathname: E/EX/EXODIST/Term-Table-0.015.tar.gz 123 | provides: 124 | Term::Table 0.015 125 | Term::Table::Cell 0.015 126 | Term::Table::CellStack 0.015 127 | Term::Table::HashBase 0.015 128 | Term::Table::LineBreak 0.015 129 | Term::Table::Spacer 0.015 130 | Term::Table::Util 0.015 131 | requirements: 132 | Carp 0 133 | ExtUtils::MakeMaker 0 134 | Importer 0.024 135 | List::Util 0 136 | Scalar::Util 0 137 | perl 5.008001 138 | Test-Simple-1.302183 139 | pathname: E/EX/EXODIST/Test-Simple-1.302183.tar.gz 140 | provides: 141 | Test2 1.302183 142 | Test2::API 1.302183 143 | Test2::API::Breakage 1.302183 144 | Test2::API::Context 1.302183 145 | Test2::API::Instance 1.302183 146 | Test2::API::InterceptResult 1.302183 147 | Test2::API::InterceptResult::Event 1.302183 148 | Test2::API::InterceptResult::Facet 1.302183 149 | Test2::API::InterceptResult::Hub 1.302183 150 | Test2::API::InterceptResult::Squasher 1.302183 151 | Test2::API::Stack 1.302183 152 | Test2::Event 1.302183 153 | Test2::Event::Bail 1.302183 154 | Test2::Event::Diag 1.302183 155 | Test2::Event::Encoding 1.302183 156 | Test2::Event::Exception 1.302183 157 | Test2::Event::Fail 1.302183 158 | Test2::Event::Generic 1.302183 159 | Test2::Event::Note 1.302183 160 | Test2::Event::Ok 1.302183 161 | Test2::Event::Pass 1.302183 162 | Test2::Event::Plan 1.302183 163 | Test2::Event::Skip 1.302183 164 | Test2::Event::Subtest 1.302183 165 | Test2::Event::TAP::Version 1.302183 166 | Test2::Event::V2 1.302183 167 | Test2::Event::Waiting 1.302183 168 | Test2::EventFacet 1.302183 169 | Test2::EventFacet::About 1.302183 170 | Test2::EventFacet::Amnesty 1.302183 171 | Test2::EventFacet::Assert 1.302183 172 | Test2::EventFacet::Control 1.302183 173 | Test2::EventFacet::Error 1.302183 174 | Test2::EventFacet::Hub 1.302183 175 | Test2::EventFacet::Info 1.302183 176 | Test2::EventFacet::Info::Table 1.302183 177 | Test2::EventFacet::Meta 1.302183 178 | Test2::EventFacet::Parent 1.302183 179 | Test2::EventFacet::Plan 1.302183 180 | Test2::EventFacet::Render 1.302183 181 | Test2::EventFacet::Trace 1.302183 182 | Test2::Formatter 1.302183 183 | Test2::Formatter::TAP 1.302183 184 | Test2::Hub 1.302183 185 | Test2::Hub::Interceptor 1.302183 186 | Test2::Hub::Interceptor::Terminator 1.302183 187 | Test2::Hub::Subtest 1.302183 188 | Test2::IPC 1.302183 189 | Test2::IPC::Driver 1.302183 190 | Test2::IPC::Driver::Files 1.302183 191 | Test2::Tools::Tiny 1.302183 192 | Test2::Util 1.302183 193 | Test2::Util::ExternalMeta 1.302183 194 | Test2::Util::Facets2Legacy 1.302183 195 | Test2::Util::HashBase 1.302183 196 | Test2::Util::Trace 1.302183 197 | Test::Builder 1.302183 198 | Test::Builder::Formatter 1.302183 199 | Test::Builder::IO::Scalar 2.114 200 | Test::Builder::Module 1.302183 201 | Test::Builder::Tester 1.302183 202 | Test::Builder::Tester::Color 1.302183 203 | Test::Builder::Tester::Tie 1.302183 204 | Test::Builder::TodoDiag 1.302183 205 | Test::More 1.302183 206 | Test::Simple 1.302183 207 | Test::Tester 1.302183 208 | Test::Tester::Capture 1.302183 209 | Test::Tester::CaptureRunner 1.302183 210 | Test::Tester::Delegate 1.302183 211 | Test::use::ok 1.302183 212 | ok 1.302183 213 | requirements: 214 | ExtUtils::MakeMaker 0 215 | File::Spec 0 216 | File::Temp 0 217 | Scalar::Util 1.13 218 | Storable 0 219 | perl 5.006002 220 | utf8 0 221 | Test2-Suite-0.000138 222 | pathname: E/EX/EXODIST/Test2-Suite-0.000138.tar.gz 223 | provides: 224 | Test2::AsyncSubtest 0.000138 225 | Test2::AsyncSubtest::Event::Attach 0.000138 226 | Test2::AsyncSubtest::Event::Detach 0.000138 227 | Test2::AsyncSubtest::Formatter 0.000138 228 | Test2::AsyncSubtest::Hub 0.000138 229 | Test2::Bundle 0.000138 230 | Test2::Bundle::Extended 0.000138 231 | Test2::Bundle::More 0.000138 232 | Test2::Bundle::Simple 0.000138 233 | Test2::Compare 0.000138 234 | Test2::Compare::Array 0.000138 235 | Test2::Compare::Bag 0.000138 236 | Test2::Compare::Base 0.000138 237 | Test2::Compare::Bool 0.000138 238 | Test2::Compare::Custom 0.000138 239 | Test2::Compare::DeepRef 0.000138 240 | Test2::Compare::Delta 0.000138 241 | Test2::Compare::Event 0.000138 242 | Test2::Compare::EventMeta 0.000138 243 | Test2::Compare::Float 0.000138 244 | Test2::Compare::Hash 0.000138 245 | Test2::Compare::Meta 0.000138 246 | Test2::Compare::Negatable 0.000138 247 | Test2::Compare::Number 0.000138 248 | Test2::Compare::Object 0.000138 249 | Test2::Compare::OrderedSubset 0.000138 250 | Test2::Compare::Pattern 0.000138 251 | Test2::Compare::Ref 0.000138 252 | Test2::Compare::Regex 0.000138 253 | Test2::Compare::Scalar 0.000138 254 | Test2::Compare::Set 0.000138 255 | Test2::Compare::String 0.000138 256 | Test2::Compare::Undef 0.000138 257 | Test2::Compare::Wildcard 0.000138 258 | Test2::Manual 0.000138 259 | Test2::Manual::Anatomy 0.000138 260 | Test2::Manual::Anatomy::API 0.000138 261 | Test2::Manual::Anatomy::Context 0.000138 262 | Test2::Manual::Anatomy::EndToEnd 0.000138 263 | Test2::Manual::Anatomy::Event 0.000138 264 | Test2::Manual::Anatomy::Hubs 0.000138 265 | Test2::Manual::Anatomy::IPC 0.000138 266 | Test2::Manual::Anatomy::Utilities 0.000138 267 | Test2::Manual::Contributing 0.000138 268 | Test2::Manual::Testing 0.000138 269 | Test2::Manual::Testing::Introduction 0.000138 270 | Test2::Manual::Testing::Migrating 0.000138 271 | Test2::Manual::Testing::Planning 0.000138 272 | Test2::Manual::Testing::Todo 0.000138 273 | Test2::Manual::Tooling 0.000138 274 | Test2::Manual::Tooling::FirstTool 0.000138 275 | Test2::Manual::Tooling::Formatter 0.000138 276 | Test2::Manual::Tooling::Nesting 0.000138 277 | Test2::Manual::Tooling::Plugin::TestExit 0.000138 278 | Test2::Manual::Tooling::Plugin::TestingDone 0.000138 279 | Test2::Manual::Tooling::Plugin::ToolCompletes 0.000138 280 | Test2::Manual::Tooling::Plugin::ToolStarts 0.000138 281 | Test2::Manual::Tooling::Subtest 0.000138 282 | Test2::Manual::Tooling::TestBuilder 0.000138 283 | Test2::Manual::Tooling::Testing 0.000138 284 | Test2::Mock 0.000138 285 | Test2::Plugin 0.000138 286 | Test2::Plugin::BailOnFail 0.000138 287 | Test2::Plugin::DieOnFail 0.000138 288 | Test2::Plugin::ExitSummary 0.000138 289 | Test2::Plugin::SRand 0.000138 290 | Test2::Plugin::Times 0.000138 291 | Test2::Plugin::UTF8 0.000138 292 | Test2::Require 0.000138 293 | Test2::Require::AuthorTesting 0.000138 294 | Test2::Require::EnvVar 0.000138 295 | Test2::Require::Fork 0.000138 296 | Test2::Require::Module 0.000138 297 | Test2::Require::Perl 0.000138 298 | Test2::Require::RealFork 0.000138 299 | Test2::Require::Threads 0.000138 300 | Test2::Suite 0.000138 301 | Test2::Todo 0.000138 302 | Test2::Tools 0.000138 303 | Test2::Tools::AsyncSubtest 0.000138 304 | Test2::Tools::Basic 0.000138 305 | Test2::Tools::Class 0.000138 306 | Test2::Tools::ClassicCompare 0.000138 307 | Test2::Tools::Compare 0.000138 308 | Test2::Tools::Defer 0.000138 309 | Test2::Tools::Encoding 0.000138 310 | Test2::Tools::Event 0.000138 311 | Test2::Tools::Exception 0.000138 312 | Test2::Tools::Exports 0.000138 313 | Test2::Tools::GenTemp 0.000138 314 | Test2::Tools::Grab 0.000138 315 | Test2::Tools::Mock 0.000138 316 | Test2::Tools::Ref 0.000138 317 | Test2::Tools::Spec 0.000138 318 | Test2::Tools::Subtest 0.000138 319 | Test2::Tools::Target 0.000138 320 | Test2::Tools::Tester 0.000138 321 | Test2::Tools::Warnings 0.000138 322 | Test2::Util::Grabber 0.000138 323 | Test2::Util::Ref 0.000138 324 | Test2::Util::Stash 0.000138 325 | Test2::Util::Sub 0.000138 326 | Test2::Util::Table 0.000138 327 | Test2::Util::Table::Cell 0.000138 328 | Test2::Util::Table::LineBreak 0.000138 329 | Test2::Util::Term 0.000138 330 | Test2::Util::Times 0.000138 331 | Test2::V0 0.000138 332 | Test2::Workflow 0.000138 333 | Test2::Workflow::BlockBase 0.000138 334 | Test2::Workflow::Build 0.000138 335 | Test2::Workflow::Runner 0.000138 336 | Test2::Workflow::Task 0.000138 337 | Test2::Workflow::Task::Action 0.000138 338 | Test2::Workflow::Task::Group 0.000138 339 | requirements: 340 | B 0 341 | Carp 0 342 | Data::Dumper 0 343 | Exporter 0 344 | ExtUtils::MakeMaker 0 345 | Importer 0.024 346 | Module::Pluggable 2.7 347 | Scalar::Util 0 348 | Scope::Guard 0 349 | Sub::Info 0.002 350 | Term::Table 0.013 351 | Test2::API 1.302176 352 | Time::HiRes 0 353 | overload 0 354 | perl 5.008001 355 | utf8 0 356 | -------------------------------------------------------------------------------- /test/basic/run: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env perl 2 | 3 | use strict; 4 | use warnings; 5 | 6 | for my $t (qw( next latest )) { 7 | my $tag = "xxx:$t"; 8 | system('docker', 'build', '--tag', $tag, '--build-arg', "BASE=$t", '.') and die; 9 | system('docker', 'run', '-i', '--rm', $tag, '/usr/bin/prove', '-lv') and die; 10 | system('docker', 'rmi', $tag); 11 | print "\n\n"; 12 | } 13 | -------------------------------------------------------------------------------- /test/basic/t/env.t: -------------------------------------------------------------------------------- 1 | #!perl 2 | 3 | use Test2::V0; 4 | 5 | like($ENV{PERL5LIB}, qr{^/app/lib:}, 'proper PERl5LIB for main app'); 6 | like($ENV{PERL5LIB}, qr{:/app/elib/x/lib:}, 'proper PERl5LIB for submodules'); 7 | 8 | done_testing(); 9 | -------------------------------------------------------------------------------- /test/basic/t/https.t: -------------------------------------------------------------------------------- 1 | #!perl 2 | 3 | use Test2::V0; 4 | use HTTP::Tiny; 5 | 6 | my $ua = HTTP::Tiny->new(timeout => 5); 7 | 8 | my $res = $ua->get('https://www.simplicidade.org/'); 9 | ok($res->{success}, 'HTTPS support ok'); 10 | 11 | done_testing(); 12 | -------------------------------------------------------------------------------- /test/lambda/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM melopt/perl-alt:perl-latest-build AS build 2 | 3 | COPY cpanfile* /app 4 | RUN cd /app && pdi-build-deps 5 | 6 | FROM melopt/perl-alt:perl-latest-runtime 7 | 8 | COPY . /app 9 | 10 | -------------------------------------------------------------------------------- /test/lambda/cpanfile: -------------------------------------------------------------------------------- 1 | requires 'JSON::XS'; 2 | 3 | -------------------------------------------------------------------------------- /test/lambda/cpanfile.snapshot: -------------------------------------------------------------------------------- 1 | # carton snapshot format: version 1.0 2 | DISTRIBUTIONS 3 | Canary-Stability-2013 4 | pathname: M/ML/MLEHMANN/Canary-Stability-2013.tar.gz 5 | provides: 6 | Canary::Stability 2013 7 | requirements: 8 | ExtUtils::MakeMaker 0 9 | JSON-XS-4.03 10 | pathname: M/ML/MLEHMANN/JSON-XS-4.03.tar.gz 11 | provides: 12 | JSON::XS 4.03 13 | requirements: 14 | Canary::Stability 0 15 | ExtUtils::MakeMaker 6.52 16 | Types::Serialiser 0 17 | common::sense 0 18 | Types-Serialiser-1.01 19 | pathname: M/ML/MLEHMANN/Types-Serialiser-1.01.tar.gz 20 | provides: 21 | JSON::PP::Boolean 1.01 22 | Types::Serialiser 1.01 23 | Types::Serialiser::BooleanBase 1.01 24 | Types::Serialiser::Error 1.01 25 | requirements: 26 | ExtUtils::MakeMaker 0 27 | common::sense 0 28 | common-sense-3.75 29 | pathname: M/ML/MLEHMANN/common-sense-3.75.tar.gz 30 | provides: 31 | common::sense 3.75 32 | requirements: 33 | ExtUtils::MakeMaker 0 34 | -------------------------------------------------------------------------------- /test/lambda/lambda-handlers/handler.pl: -------------------------------------------------------------------------------- 1 | #!perl 2 | 3 | use strict; 4 | use warnings; 5 | use JSON::MaybeXS; 6 | 7 | sub echo { 8 | my ($payload, $context) = @_; 9 | 10 | return encode_json({ payload => $payload, context => { %$context } }); 11 | } 12 | 13 | 1; 14 | -------------------------------------------------------------------------------- /test/lambda/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker build -t z . 4 | clear 5 | 6 | cmd="docker run -it -p 9000:8080 z" 7 | 8 | echo "**** Should fail..." 9 | echo 10 | $cmd notfound.echo 11 | 12 | echo 13 | echo "**** Will start but fails later... Try:" 14 | echo "curl -XPOST 'http://localhost:9000/2015-03-31/functions/function/invocations' -d '{}'" 15 | echo 16 | $cmd handler.notfound 17 | 18 | echo 19 | echo "**** To test:" 20 | echo "curl -XPOST 'http://localhost:9000/2015-03-31/functions/function/invocations' -d '{}'" 21 | echo 22 | $cmd handler.echo 23 | --------------------------------------------------------------------------------