├── .github ├── dependabot.yml └── workflows │ ├── publish-to-docker.yml │ ├── test-cpanfile.yml │ └── validate.yaml ├── .gitignore ├── Dockerfile ├── README.md └── cpanfile /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | # Check for updates to GitHub Actions every week 7 | interval: "weekly" 8 | -------------------------------------------------------------------------------- /.github/workflows/publish-to-docker.yml: -------------------------------------------------------------------------------- 1 | # https://github.com/marketplace/actions/publish-docker 2 | 3 | name: Publish to Docker 4 | on: 5 | push: 6 | branches: 7 | - "main" 8 | schedule: 9 | - cron: "10 6 * * *" 10 | workflow_dispatch: 11 | 12 | jobs: 13 | prepare-matrix-buster: 14 | runs-on: ubuntu-latest 15 | name: List perl versions 16 | outputs: 17 | perl-versions: ${{ steps.action.outputs.perl-versions }} 18 | steps: 19 | - name: Perl versions action step 20 | id: action 21 | uses: perl-actions/perl-versions@main 22 | with: 23 | since-perl: '5.10' 24 | with-devel: 'true' 25 | 26 | # bookworm base images only exist for 5.36 and newer. 27 | prepare-matrix-bookworm: 28 | runs-on: ubuntu-latest 29 | name: List perl versions 30 | outputs: 31 | perl-versions: ${{ steps.action.outputs.perl-versions }} 32 | steps: 33 | - name: Perl versions action step 34 | id: action 35 | uses: perl-actions/perl-versions@main 36 | with: 37 | since-perl: '5.36' 38 | with-devel: 'true' 39 | 40 | latest-build: 41 | name: "Build latest" 42 | runs-on: ubuntu-latest 43 | strategy: 44 | fail-fast: false 45 | matrix: 46 | debian-version: [buster,bookworm] 47 | 48 | steps: 49 | - uses: actions/checkout@v4 50 | - name: Publish to Registry 51 | uses: elgohr/Publish-Docker-Github-Action@v5 52 | with: 53 | name: ${{ secrets.DOCKER_REPO }} 54 | username: ${{ secrets.DOCKER_USERNAME }} 55 | password: ${{ secrets.DOCKER_GITHUB_TOKEN }} 56 | dockerfile: Dockerfile 57 | buildargs: BASE=buster 58 | tags: "latest,${{ matrix.debian-version }}" 59 | 60 | build-buster: 61 | name: "Build versions for buster" 62 | runs-on: ubuntu-latest 63 | needs: 64 | - prepare-matrix-buster 65 | 66 | strategy: 67 | fail-fast: false 68 | matrix: 69 | perl-version: ${{ fromJson (needs.prepare-matrix-buster.outputs.perl-versions) }} 70 | steps: 71 | - uses: actions/checkout@v4 72 | - name: Publish to Registry 73 | uses: elgohr/Publish-Docker-Github-Action@v5 74 | with: 75 | name: ${{ secrets.DOCKER_REPO }} 76 | username: ${{ secrets.DOCKER_USERNAME }} 77 | password: ${{ secrets.DOCKER_GITHUB_TOKEN }} 78 | dockerfile: Dockerfile 79 | buildargs: BASE=${{ matrix.perl-version }}-buster,CPANOUTDATED=1 80 | tags: "${{ matrix.perl-version }}-buster,${{ matrix.perl-version }}" 81 | 82 | build-bookworm: 83 | name: "Build versions for bookworm" 84 | runs-on: ubuntu-latest 85 | needs: 86 | - prepare-matrix-bookworm 87 | 88 | strategy: 89 | fail-fast: false 90 | matrix: 91 | perl-version: ${{ fromJson (needs.prepare-matrix-bookworm.outputs.perl-versions) }} 92 | steps: 93 | - uses: actions/checkout@v4 94 | - name: Publish to Registry 95 | uses: elgohr/Publish-Docker-Github-Action@v5 96 | with: 97 | name: ${{ secrets.DOCKER_REPO }} 98 | username: ${{ secrets.DOCKER_USERNAME }} 99 | password: ${{ secrets.DOCKER_GITHUB_TOKEN }} 100 | dockerfile: Dockerfile 101 | buildargs: BASE=${{ matrix.perl-version }}-slim-bookworm,CPANOUTDATED=1 102 | tags: "${{ matrix.perl-version }}-slim-bookworm" 103 | -------------------------------------------------------------------------------- /.github/workflows/test-cpanfile.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Install from cpanfile 3 | 4 | on: 5 | pull_request: 6 | branches: 7 | - '*' 8 | workflow_dispatch: 9 | jobs: 10 | prepare-matrix: 11 | runs-on: ubuntu-latest 12 | name: List perl versions 13 | outputs: 14 | perl-versions: ${{ steps.action.outputs.perl-versions }} 15 | steps: 16 | - name: Perl versions action step 17 | id: action 18 | uses: perl-actions/perl-versions@main 19 | with: 20 | since-perl: '5.10' 21 | with-devel: 'true' 22 | 23 | test-job: 24 | runs-on: ubuntu-latest 25 | needs: 26 | - prepare-matrix 27 | container: 28 | image: perl:${{ matrix.perl-version }}-buster 29 | strategy: 30 | fail-fast: false 31 | matrix: 32 | perl-version: ${{ fromJson (needs.prepare-matrix.outputs.perl-versions) }} 33 | name: Perl ${{ matrix.perl-version }} 34 | steps: 35 | - uses: actions/checkout@v4 36 | - name: Install deps using cpm 37 | uses: perl-actions/install-with-cpm@v1 38 | with: 39 | cpanfile: 'cpanfile' 40 | sudo: false 41 | -------------------------------------------------------------------------------- /.github/workflows/validate.yaml: -------------------------------------------------------------------------------- 1 | name: Actions Workflows 2 | 3 | on: 4 | push: 5 | paths: 6 | - ".github/workflows/*" 7 | pull_request: 8 | paths: 9 | - ".github/workflows/*" 10 | 11 | jobs: 12 | actions: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | with: 18 | submodules: true 19 | 20 | - name: Install action-validator with asdf 21 | uses: asdf-vm/actions/install@v3 22 | with: 23 | tool_versions: | 24 | action-validator 0.5.1 25 | 26 | - name: Lint Actions 27 | run: | 28 | find .github/workflows -type f \( -iname \*.yaml -o -iname \*.yml \) \ 29 | | xargs -I {} action-validator --verbose {} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG BASE 2 | ARG CPANOUTDATED 3 | FROM perl:${BASE} 4 | 5 | SHELL ["/bin/bash", "-o", "pipefail", "-c"] 6 | 7 | COPY cpanfile /tmp/ 8 | 9 | RUN perl -V 10 | 11 | RUN apt-get update && \ 12 | apt-get dist-upgrade -y && \ 13 | apt-get -y --no-install-recommends install \ 14 | aspell aspell-en \ 15 | build-essential \ 16 | git 17 | 18 | RUN cpanm --self-upgrade || \ 19 | ( echo "# Installing cpanminus:"; curl -sL https://cpanmin.us/ | perl - App::cpanminus ) 20 | 21 | RUN cpanm -nq App::cpm Carton::Snapshot && rm -rf /root/.cpanm 22 | 23 | RUN cpm install -g --show-build-log-on-failure --cpanfile /tmp/cpanfile && rm -rf /root/.perl-cpm 24 | 25 | RUN if [ "x${CPANOUTDATED}" = "x1" ] ; then cpan-outdated --exclude-core -p | xargs -n1 cpanm ; else cpan-outdated --exclude-core -p; fi 26 | 27 | WORKDIR /tmp/ 28 | RUN git clone https://github.com/perl-actions/ci-perl-tester-helpers.git --depth 1 && \ 29 | cp ci-perl-tester-helpers/bin/* /usr/local/bin/ && \ 30 | rm -rf ci-perl-tester-helpers && \ 31 | git config --system --add safe.directory '*' 32 | 33 | CMD ["/bin/bash"] 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docker-perl-tester 2 | 3 | This repo is used to build Perl Docker images with various pre-installed bits: 4 | 5 | - the `aspell` and `aspell-en` packages 6 | - `cpanminus` 7 | - `App::cpm` 8 | - `Devel::Cover` 9 | - various testing modules 10 | - Dist::Zilla with some common plugins (for Perl >= 5.20) 11 | 12 | At this points images are refreshed daily, which could change overtime if it becomes an issue. 13 | This should guarantee you to test uptodate CPAN stack. 14 | 15 | Note: if one dependency fails to install, this should not impact you as the image would not be published 16 | on failures. 17 | 18 | # List of Perl modules 19 | 20 | See also the `cpanfile` in this repo for an up to date list of available 21 | modules. 22 | 23 | ## Available on all Perl Versions 24 | 25 | - Code::TidyAll::Plugin::SortLines::Naturally 26 | - Code::TidyAll::Plugin::UniqueLines 27 | - Devel::Cover 28 | - Devel::Cover::Report::Codecov 29 | - Devel::Cover::Report::Coveralls 30 | - ExtUtils::MakeMaker 31 | - File::Temp 32 | - List::MoreUtils 33 | - Module::Build 34 | - Pod::Coverage::TrustPod 35 | - Test2::Bundle::Extended 36 | - Test2::Plugin::NoWarnings 37 | - Test2::Suite 38 | - Test2::Tools::Explain 39 | - Test::Builder 40 | - Test::CPAN::Meta 41 | - Test::Deep 42 | - Test::Differences 43 | - Test::EOL 44 | - Test::Fatal 45 | - Test::MinimumVersion 46 | - Test::MockModule 47 | - Test::Mojibake 48 | - Test::More 49 | - Test::Needs 50 | - Test::Notabs 51 | - Test::Pod 52 | - Test::Pod::Coverage 53 | - Test::Portability::Files 54 | - Test::RequiresInternet 55 | - Test::Simple 56 | - Test::Spelling 57 | - Test::Synopsis 58 | - Test::Version 59 | - Test::Warnings 60 | 61 | ## Only on Perl 5.10 and later 62 | 63 | - Code::TidyAll::Plugin::Test::Vars 64 | - Test::Vars 65 | 66 | ## Only on Perl 5.12 and later 67 | 68 | - Pod::Readme 69 | 70 | ## Only on Perl 5.20 and later 71 | 72 | - Dist::Zilla & friends 73 | - Dist::Zilla::PluginBundle::Author::ETHER 74 | 75 | # Using Docker Images for your projects 76 | 77 | The images can be found at [https://hub.docker.com/repository/docker/perldocker/perl-tester/](https://hub.docker.com/repository/docker/perldocker/perl-tester/) 78 | 79 | The following tags are available from the repository `perldocker/perl-tester` 80 | 81 | ``` 82 | devel 83 | 5.40 84 | 5.38 85 | 5.36 86 | 5.34 87 | 5.32 88 | 5.30 89 | 5.28 90 | 5.26 91 | 5.24 92 | 5.22 93 | 5.20 94 | 5.18 95 | 5.16 96 | 5.14 97 | 5.12 98 | 5.10 99 | ``` 100 | 101 | ## devel build 102 | 103 | Note that the `devel` build was added to test on the current Perl development version. (example: `5.37.8`, ) 104 | This is tracking the last Perl `devel` version released. 105 | 106 | ## OS flavor 107 | 108 | Images are built for both Debian `buster` and Debian `bookworm`. The 109 | versions without an explicit Debian version are `buster`. 110 | 111 | # Continuous Integrations 112 | 113 | ## Using the images with GitHub Workflow 114 | 115 | Here is a sample workflow for Linux running on all Perl version 5.10 to 5.40 116 | You can save the content in `.github/workflow/linux.yml`. 117 | 118 | Note: this example is using cpm to install the dependencies from a cpanfile. 119 | You can comment this line or use Dist::Zilla instead for supported Perl versions. 120 | 121 | ```yaml 122 | name: linux 123 | 124 | on: 125 | push: 126 | branches: 127 | - '*' 128 | tags-ignore: 129 | - '*' 130 | pull_request: 131 | 132 | jobs: 133 | perl: 134 | env: 135 | # some plugins still needs this to run their tests... 136 | PERL_USE_UNSAFE_INC: 0 137 | AUTHOR_TESTING: 1 138 | AUTOMATED_TESTING: 1 139 | RELEASE_TESTING: 1 140 | 141 | runs-on: ubuntu-latest 142 | 143 | strategy: 144 | fail-fast: false 145 | matrix: 146 | perl-version: 147 | - '5.40' 148 | - '5.38' 149 | - '5.36' 150 | - '5.34' 151 | - '5.32' 152 | - '5.30' 153 | - '5.28' 154 | - '5.26' 155 | - '5.24' 156 | - '5.22' 157 | - '5.20' 158 | - '5.18' 159 | - '5.16' 160 | - '5.14' 161 | - '5.12' 162 | - '5.10' 163 | 164 | container: 165 | image: perldocker/perl-tester:${{ matrix.perl-version }} 166 | 167 | steps: 168 | - uses: actions/checkout@v4 169 | - name: perl -V 170 | run: perl -V 171 | - name: Install Dependencies 172 | run: cpm install -g --no-test --show-build-log-on-failure --cpanfile cpanfile 173 | - name: Makefile.PL 174 | run: perl Makefile.PL 175 | - name: make test 176 | run: make test 177 | ``` 178 | 179 | ## Using Helper scripts 180 | 181 | The scripts from [perl-actions/ci-perl-tester-helpers](https://github.com/perl-actions/ci-perl-tester-helpers) are available in the path of each container. These scripts can build and test dists for you in various scenarios. See [https://github.com/Perl-Critic/PPI/blob/master/.github/workflows/dzil-build-and-test.yml](https://github.com/Perl-Critic/PPI/blob/master/.github/workflows/dzil-build-and-test.yml) for an example of how to use the helpers to build and tests a Perl distribution. 182 | 183 | ## More Examples 184 | 185 | You can find more details on how to setup GitHub workflow to smoke Perl projects by reading [skaji/perl-github-actions-sample](https://github.com/skaji/perl-github-actions-sample) GitHub repository. 186 | 187 | ## Using GitHub actions 188 | 189 | You can also consider using GitHub actions: 190 | - [perl-actions/install-with-cpanm](https://github.com/perl-actions/install-with-cpanm) 191 | - [perl-actions/install-with-cpm](https://github.com/perl-actions/install-with-cpm) 192 | 193 | ## Building Docker images 194 | 195 | When pushing to GitHub, it's using a GitHub action `.github/workflows/publish-to-docker.yml` 196 | to automagically build and publish the docker images for you. 197 | 198 | If you consider cloning this repository, you would have to set in your GitHub repository the following secret variables, with some example values. 199 | 200 | ``` 201 | DOCKER_REPO=perldocker/perl-tester 202 | DOCKER_USERNAME=username 203 | DOCKER_GITHUB_TOKEN=a-token-or-password 204 | ``` 205 | 206 | ## Developer Notes: 207 | 208 | The main branch is named `main` and not `master`. 209 | 210 | # Author 211 | 212 | @oalders initiated the project and @atoomic tried to give it more public visibility 213 | volunteers/ideas are welcome to improve the project. 214 | -------------------------------------------------------------------------------- /cpanfile: -------------------------------------------------------------------------------- 1 | use strict; # satisfy linter 2 | use warnings; # satisfy linter 3 | 4 | =pod 5 | 6 | =head1 requires_by_perl 7 | 8 | Semantic helper to simplify management of modules which have changed 9 | their required Perl version (directly or via dependencies) 10 | 11 | requires_by_perl 'Module', 12 | prior 5.010 => 'use version X', 13 | prior 5.012 => 'use version Y', 14 | otherwise skip 15 | ; 16 | 17 | =head1 prior 18 | 19 | prior VERSION => VERSION_SPEC, ... 20 | 21 | requires_by_perl 'Module', 22 | prior 5.010 => skip, 23 | ; 24 | 25 | Semantic helper function to give data meaning, 26 | which version of a module should be installed for a Perl version 27 | prior to specified version. 28 | 29 | =head1 otherwise 30 | 31 | otherwise VERSION_SPEC 32 | 33 | requires_by_perl 'Module', 34 | prior 5.010 => skip, 35 | otherwise '5.0', 36 | ; 37 | 38 | Semantic sugar function to give data meaning, 39 | which version of a module to install when none of the previous 40 | L expressions match. 41 | 42 | =head1 skip 43 | 44 | prior 5.010 => skip, 45 | otherwise skip, 46 | 47 | Semantic helper function representing L with the meaning: 48 | do not install explicitly. 49 | 50 | =cut 51 | 52 | sub requires_by_perl { 53 | my @requires = (shift); 54 | 55 | while (@_) { 56 | shift, next 57 | unless @_ == 1 || $] < shift 58 | ; 59 | 60 | push @requires, shift // return; 61 | last; 62 | } 63 | 64 | requires @requires; 65 | } 66 | 67 | sub prior { @_ } 68 | sub otherwise { @_ } 69 | sub skip { undef } 70 | 71 | requires_by_perl 'App::cpanoutdated', 72 | ; 73 | 74 | requires_by_perl 'Code::TidyAll::Plugin::SortLines::Naturally', 75 | prior 5.012 => skip 76 | ; 77 | 78 | requires_by_perl 'Code::TidyAll::Plugin::Test::Vars', 79 | prior 5.012 => skip, 80 | ; 81 | 82 | requires_by_perl 'Code::TidyAll::Plugin::UniqueLines', 83 | prior 5.014 => skip, 84 | ; 85 | 86 | requires_by_perl 'Data::OptList', 87 | prior 5.012 => '==0.113', 88 | otherwise skip 89 | ; 90 | 91 | requires_by_perl 'Data::Section', 92 | prior 5.012 => '==0.200007', 93 | otherwise skip, 94 | ; 95 | 96 | requires_by_perl 'Devel::Cover', 97 | prior 5.010 => skip, 98 | prior 5.012 => '==1.42', 99 | ; 100 | 101 | requires_by_perl 'Devel::Cover::Report::Codecov', 102 | prior 5.010 => skip, 103 | ; 104 | 105 | requires_by_perl 'Devel::Cover::Report::Coveralls', 106 | prior 5.010 => skip, 107 | ; 108 | 109 | requires_by_perl 'Dist::Zilla::Plugin::CheckChangeLog', 110 | prior 5.020 => skip, 111 | ; 112 | 113 | requires_by_perl 'Dist::Zilla::Plugin::CopyFilesFromRelease', 114 | prior 5.020 => skip, 115 | ; 116 | 117 | requires_by_perl 'Dist::Zilla::Plugin::Deprecated', 118 | prior 5.020 => skip, 119 | ; 120 | 121 | requires_by_perl 'Dist::Zilla::Plugin::Git::Contributors', 122 | prior 5.020 => skip, 123 | ; 124 | 125 | requires_by_perl 'Dist::Zilla::Plugin::GitHubREADME::Badge', 126 | prior 5.020 => skip, 127 | ; 128 | 129 | requires_by_perl 'Dist::Zilla::Plugin::OurPkgVersion', 130 | prior 5.020 => skip, 131 | ; 132 | 133 | requires_by_perl 'Dist::Zilla::Plugin::Regenerate::AfterReleasers', 134 | prior 5.020 => skip, 135 | ; 136 | 137 | requires_by_perl 'Dist::Zilla::Plugin::StaticInstall', 138 | prior 5.020 => skip, 139 | ; 140 | 141 | requires_by_perl 'Dist::Zilla::Plugin::Test::ReportPrereqs', 142 | prior 5.020 => skip, 143 | ; 144 | 145 | requires_by_perl 'Dist::Zilla::PluginBundle::Author::ETHER', 146 | prior 5.020 => skip, 147 | ; 148 | 149 | requires_by_perl 'Dist::Zilla::PluginBundle::Author::OALDERS', 150 | prior 5.020 => skip, 151 | ; 152 | 153 | requires_by_perl 'Dist::Zilla::PluginBundle::DROLSKY', 154 | prior 5.020 => skip, 155 | ; 156 | 157 | requires_by_perl 'Dist::Zilla::PluginBundle::Milla', 158 | prior 5.020 => skip, 159 | ; 160 | 161 | requires_by_perl 'Dist::Zilla::PluginBundle::RJBS', 162 | prior 5.020 => skip, 163 | prior 5.026 => '==5.023', 164 | prior 5.034 => '==5.025', 165 | otherwise '>5.028' # 5.028 requires v5.36 whereas following versions only v5.34, so omit it 166 | ; 167 | 168 | requires_by_perl 'Dist::Zilla::PluginBundle::Starter::Git', 169 | prior 5.020 => skip, 170 | ; 171 | 172 | requires_by_perl 'ExtUtils::MakeMaker', 173 | ; 174 | 175 | requires_by_perl 'File::Temp', 176 | ; 177 | 178 | requires_by_perl 'IO::Socket::IP', 179 | prior 5.014 => '==0.41', 180 | ; 181 | 182 | requires_by_perl 'List::MoreUtils', 183 | ; 184 | 185 | requires_by_perl 'Minilla', 186 | prior 5.010 => skip, 187 | ; 188 | 189 | requires_by_perl 'Module::Build', 190 | ; 191 | 192 | requires_by_perl 'Perl::Critic', 193 | prior 5.010 => '==1.142', 194 | otherwise '>= 1.144', 195 | ; 196 | 197 | requires_by_perl 'Perl::Tidy', '>= 20220217', 198 | ; 199 | 200 | requires_by_perl 'Plack', 201 | prior 5.012 => '==1.0050', 202 | otherwise skip 203 | ; 204 | 205 | requires_by_perl 'Plack::Test', 206 | prior 5.012 => skip 207 | ; 208 | 209 | requires_by_perl 'Pod::Coverage::TrustPod', 210 | prior 5.014 => skip, 211 | ; 212 | 213 | requires_by_perl 'Pod::Man', 214 | prior 5.010 => '==4.14', 215 | prior 5.012 => '==5.01', 216 | ; 217 | 218 | requires_by_perl 'Pod::Readme', 219 | prior 5.012 => skip, 220 | ; 221 | 222 | requires_by_perl 'Pod::Spell', '>= 1.25', 223 | ; 224 | 225 | 226 | requires_by_perl 'Software::License::Perl_5', 227 | prior 5.012 => '==0.104004', 228 | ; 229 | 230 | requires_by_perl 'Sub::Exporter', 231 | prior 5.012 => '==0.990', 232 | otherwise skip 233 | ; 234 | 235 | requires_by_perl 'Test2::Bundle::Extended', 236 | ; 237 | 238 | requires_by_perl 'Test2::Harness', 239 | prior 5.010 => skip, 240 | prior 5.014 => '==1.000156', 241 | ; 242 | 243 | requires_by_perl 'Test2::Harness::Renderer::JUnit', 244 | prior 5.010001 => skip, 245 | prior 5.014 => '==1.000005', 246 | ; 247 | 248 | requires_by_perl 'Test2::Plugin::NoWarnings', 249 | ; 250 | 251 | requires_by_perl 'Test2::Suite', 252 | ; 253 | 254 | requires_by_perl 'Test2::Tools::Explain', 255 | ; 256 | 257 | requires_by_perl 'Test::Builder', 258 | ; 259 | 260 | requires_by_perl 'Test::CPAN::Meta', 261 | ; 262 | 263 | requires_by_perl 'Test::Deep', 264 | prior 5.012 => '==1.130', 265 | otherwise skip 266 | ; 267 | 268 | requires_by_perl 'Test::Differences', 269 | ; 270 | 271 | requires_by_perl 'Test::EOL', 272 | ; 273 | 274 | requires_by_perl 'Test::Fatal', 275 | ; 276 | 277 | requires_by_perl 'Test::MinimumVersion', 278 | ; 279 | 280 | requires_by_perl 'Test::MockModule', 281 | prior 5.012 => '==0.178', 282 | ; 283 | 284 | requires_by_perl 'Test::Mojibake', 285 | ; 286 | 287 | requires_by_perl 'Test::More', 288 | ; 289 | 290 | requires_by_perl 'Test::Needs', 291 | ; 292 | 293 | requires_by_perl 'Test::NoTabs', 294 | ; 295 | 296 | requires_by_perl 'Test::Perl::Critic', 297 | ; 298 | 299 | requires_by_perl 'Test::Pod', 300 | ; 301 | 302 | requires_by_perl 'Test::Pod::Coverage', 303 | ; 304 | 305 | requires_by_perl 'Test::Portability::Files', 306 | ; 307 | 308 | requires_by_perl 'Test::RequiresInternet', 309 | ; 310 | 311 | requires_by_perl 'Test::Simple', 312 | ; 313 | 314 | requires_by_perl 'Test::Spelling', 315 | ; 316 | 317 | requires_by_perl 'Test::Synopsis', 318 | ; 319 | 320 | requires_by_perl 'Test::Vars', 321 | prior 5.010 => skip, 322 | ; 323 | 324 | requires_by_perl 'Test::Version', 325 | ; 326 | 327 | requires_by_perl 'Test::Warnings', 328 | ; 329 | 330 | --------------------------------------------------------------------------------