pypa-hatch/1.4/how-to/plugins/testing-builds/index.html

62 lines
39 KiB
HTML

<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Modern, extensible Python project management"><meta name=author content="Ofek Lev"><link href=https://hatch.pypa.io/latest/1.4/how-to/plugins/testing-builds/ rel=canonical><link rel=icon href=../../../assets/images/favicon.ico><meta name=generator content="mkdocs-1.3.1, mkdocs-material-8.3.9"><title>Testing builds - Hatch</title><link rel=stylesheet href=../../../assets/stylesheets/main.1d29e8d0.min.css><link rel=stylesheet href=../../../assets/stylesheets/palette.cbb835fc.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><link rel=stylesheet href=../../../assets/_mkdocstrings.css><link rel=stylesheet href=../../../assets/css/custom.css><link rel=stylesheet href=https://cdn.jsdelivr.net/gh/tonsky/FiraCode@5.2/distr/fira_code.css><script>__md_scope=new URL("../../..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=slate data-md-color-primary=indigo data-md-color-accent=indigo> <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#testing-builds class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <div data-md-component=outdated hidden> <aside class="md-banner md-banner--warning"> </aside> </div> <header class="md-header md-header--lifted" data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../../.. title=Hatch class="md-header__button md-logo" aria-label=Hatch data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M6.89 6.36C8.23 3.91 10 2 12 2c2 0 3.77 1.91 5.11 4.36-.85.21-1.61.71-2.11 1.41a3.712 3.712 0 0 0-5.2-.8c-.3.22-.58.49-.8.8-.5-.7-1.26-1.2-2.11-1.41M15 18.06l-3-3-3 3-3-3-1.27 1.27a7.504 7.504 0 0 0 9.11 5.43 7.529 7.529 0 0 0 5.43-5.43L18 15.06l-3 3m-6-2.12 3-3 3 3 3-3 1.5 1.5c-.13-2.31-.7-4.58-1.69-6.68-1.16.1-2.06 1.07-2.06 2.24h-1.5A2.25 2.25 0 0 0 12 7.75 2.25 2.25 0 0 0 9.75 10h-1.5c0-1.17-.9-2.14-2.06-2.24-.99 2.1-1.56 4.37-1.69 6.68l1.5-1.5 3 3Z"/></svg> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> Hatch </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Testing builds </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme=slate data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_2 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg> </label> <input class=md-option data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to dark mode" type=radio name=__palette id=__palette_2> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg> </label> </form> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> </button> </nav> </form> <div class=md-search__output> <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/pypa/hatch title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 480 512"><!-- Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"/></svg> </div> <div class=md-source__repository> pypa/hatch </div> </a> </div> </nav> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class="md-tabs__inner md-grid"> <ul class=md-tabs__list> <li class=md-tabs__item> <a href=../../.. class=md-tabs__link> Home </a> </li> <li class=md-tabs__item> <a href=../../../config/metadata/ class=md-tabs__link> Configuration </a> </li> <li class=md-tabs__item> <a href=../../../cli/about/ class=md-tabs__link> CLI </a> </li> <li class=md-tabs__item> <a href=../../../plugins/about/ class=md-tabs__link> Plugins </a> </li> <li class=md-tabs__item> <a href=../../environment/package-indices/ class="md-tabs__link md-tabs__link--active"> How-to </a> </li> <li class=md-tabs__item> <a href=../../../meta/faq/ class=md-tabs__link> Meta </a> </li> </ul> </div> </nav> </header> <div class=md-container data-md-component=container> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../../.. title=Hatch class="md-nav__button md-logo" aria-label=Hatch data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M6.89 6.36C8.23 3.91 10 2 12 2c2 0 3.77 1.91 5.11 4.36-.85.21-1.61.71-2.11 1.41a3.712 3.712 0 0 0-5.2-.8c-.3.22-.58.49-.8.8-.5-.7-1.26-1.2-2.11-1.41M15 18.06l-3-3-3 3-3-3-1.27 1.27a7.504 7.504 0 0 0 9.11 5.43 7.529 7.529 0 0 0 5.43-5.43L18 15.06l-3 3m-6-2.12 3-3 3 3 3-3 1.5 1.5c-.13-2.31-.7-4.58-1.69-6.68-1.16.1-2.06 1.07-2.06 2.24h-1.5A2.25 2.25 0 0 0 12 7.75 2.25 2.25 0 0 0 9.75 10h-1.5c0-1.17-.9-2.14-2.06-2.24-.99 2.1-1.56 4.37-1.69 6.68l1.5-1.5 3 3Z"/></svg> </a> Hatch </label> <div class=md-nav__source> <a href=https://github.com/pypa/hatch title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 480 512"><!-- Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"/></svg> </div> <div class=md-source__repository> pypa/hatch </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_1 type=checkbox id=__nav_1 checked> <label class=md-nav__link for=__nav_1> Home <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Home data-md-level=1> <label class=md-nav__title for=__nav_1> <span class="md-nav__icon md-icon"></span> Home </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../.. class=md-nav__link> About </a> </li> <li class=md-nav__item> <a href=../../../install/ class=md-nav__link> Installation </a> </li> <li class=md-nav__item> <a href=../../../intro/ class=md-nav__link> Introduction </a> </li> <li class=md-nav__item> <a href=../../../environment/ class=md-nav__link> Environments </a> </li> <li class=md-nav__item> <a href=../../../version/ class=md-nav__link> Versioning </a> </li> <li class=md-nav__item> <a href=../../../build/ class=md-nav__link> Builds </a> </li> <li class=md-nav__item> <a href=../../../publish/ class=md-nav__link> Publishing </a> </li> <li class=md-nav__item> <a href=../../../next-steps/ class=md-nav__link> Next steps </a> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_1_9 type=checkbox id=__nav_1_9 checked> <label class=md-nav__link for=__nav_1_9> Status <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Status data-md-level=2> <label class=md-nav__title for=__nav_1_9> <span class="md-nav__icon md-icon"></span> Status </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../history/ class=md-nav__link> History </a> </li> <li class=md-nav__item> <a href=../../../users/ class=md-nav__link> Users </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_2 type=checkbox id=__nav_2 checked> <label class=md-nav__link for=__nav_2> Configuration <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Configuration data-md-level=1> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> Configuration </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../config/metadata/ class=md-nav__link> Metadata </a> </li> <li class=md-nav__item> <a href=../../../config/dependency/ class=md-nav__link> Dependencies </a> </li> <li class=md-nav__item> <a href=../../../config/build/ class=md-nav__link> Build </a> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_2_4 type=checkbox id=__nav_2_4 checked> <label class=md-nav__link for=__nav_2_4> Environments <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Environments data-md-level=2> <label class=md-nav__title for=__nav_2_4> <span class="md-nav__icon md-icon"></span> Environments </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../config/environment/overview/ class=md-nav__link> Overview </a> </li> <li class=md-nav__item> <a href=../../../config/environment/advanced/ class=md-nav__link> Advanced </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../../config/context/ class=md-nav__link> Context formatting </a> </li> <li class=md-nav__item> <a href=../../../config/project-templates/ class=md-nav__link> Project templates </a> </li> <li class=md-nav__item> <a href=../../../config/hatch/ class=md-nav__link> Hatch </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_3 type=checkbox id=__nav_3 checked> <label class=md-nav__link for=__nav_3> CLI <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=CLI data-md-level=1> <label class=md-nav__title for=__nav_3> <span class="md-nav__icon md-icon"></span> CLI </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../cli/about/ class=md-nav__link> About </a> </li> <li class=md-nav__item> <a href=../../../cli/reference/ class=md-nav__link> Reference </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4 type=checkbox id=__nav_4 checked> <label class=md-nav__link for=__nav_4> Plugins <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Plugins data-md-level=1> <label class=md-nav__title for=__nav_4> <span class="md-nav__icon md-icon"></span> Plugins </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/about/ class=md-nav__link> About </a> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_2 type=checkbox id=__nav_4_2 checked> <label class=md-nav__link for=__nav_4_2> Builder <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Builder data-md-level=2> <label class=md-nav__title for=__nav_4_2> <span class="md-nav__icon md-icon"></span> Builder </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/builder/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/builder/wheel/ class=md-nav__link> Wheel </a> </li> <li class=md-nav__item> <a href=../../../plugins/builder/sdist/ class=md-nav__link> Source distribution </a> </li> <li class=md-nav__item> <a href=../../../plugins/builder/custom/ class=md-nav__link> Custom </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_3 type=checkbox id=__nav_4_3 checked> <label class=md-nav__link for=__nav_4_3> Build hook <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Build hook" data-md-level=2> <label class=md-nav__title for=__nav_4_3> <span class="md-nav__icon md-icon"></span> Build hook </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/build-hook/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/build-hook/version/ class=md-nav__link> Version </a> </li> <li class=md-nav__item> <a href=../../../plugins/build-hook/custom/ class=md-nav__link> Custom </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_4 type=checkbox id=__nav_4_4 checked> <label class=md-nav__link for=__nav_4_4> Metadata hook <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Metadata hook" data-md-level=2> <label class=md-nav__title for=__nav_4_4> <span class="md-nav__icon md-icon"></span> Metadata hook </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/metadata-hook/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/metadata-hook/custom/ class=md-nav__link> Custom </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_5 type=checkbox id=__nav_4_5 checked> <label class=md-nav__link for=__nav_4_5> Environment <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Environment data-md-level=2> <label class=md-nav__title for=__nav_4_5> <span class="md-nav__icon md-icon"></span> Environment </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/environment/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/environment/virtual/ class=md-nav__link> Virtual </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_6 type=checkbox id=__nav_4_6 checked> <label class=md-nav__link for=__nav_4_6> Environment collector <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Environment collector" data-md-level=2> <label class=md-nav__title for=__nav_4_6> <span class="md-nav__icon md-icon"></span> Environment collector </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/environment-collector/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/environment-collector/default/ class=md-nav__link> Default </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_7 type=checkbox id=__nav_4_7 checked> <label class=md-nav__link for=__nav_4_7> Publisher <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Publisher data-md-level=2> <label class=md-nav__title for=__nav_4_7> <span class="md-nav__icon md-icon"></span> Publisher </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/publisher/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/publisher/package-index/ class=md-nav__link> Index </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_8 type=checkbox id=__nav_4_8 checked> <label class=md-nav__link for=__nav_4_8> Version source <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Version source" data-md-level=2> <label class=md-nav__title for=__nav_4_8> <span class="md-nav__icon md-icon"></span> Version source </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/version-source/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/version-source/regex/ class=md-nav__link> Regex </a> </li> <li class=md-nav__item> <a href=../../../plugins/version-source/code/ class=md-nav__link> Code </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_4_9 type=checkbox id=__nav_4_9 checked> <label class=md-nav__link for=__nav_4_9> Version scheme <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label="Version scheme" data-md-level=2> <label class=md-nav__title for=__nav_4_9> <span class="md-nav__icon md-icon"></span> Version scheme </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../plugins/version-scheme/reference/ class=md-nav__link> Reference </a> </li> <li class=md-nav__item> <a href=../../../plugins/version-scheme/standard/ class=md-nav__link> Standard </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../../plugins/utilities/ class=md-nav__link> Utilities </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=__nav_5 type=checkbox id=__nav_5 checked> <label class=md-nav__link for=__nav_5> How-to <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=How-to data-md-level=1> <label class=md-nav__title for=__nav_5> <span class="md-nav__icon md-icon"></span> How-to </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_5_1 type=checkbox id=__nav_5_1 checked> <label class=md-nav__link for=__nav_5_1> Environments <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Environments data-md-level=2> <label class=md-nav__title for=__nav_5_1> <span class="md-nav__icon md-icon"></span> Environments </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../environment/package-indices/ class=md-nav__link> Package indices </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle" data-md-toggle=__nav_5_2 type=checkbox id=__nav_5_2 checked> <label class=md-nav__link for=__nav_5_2> Plugins <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Plugins data-md-level=2> <label class=md-nav__title for=__nav_5_2> <span class="md-nav__icon md-icon"></span> Plugins </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" data-md-toggle=toc type=checkbox id=__toc> <a href=./ class="md-nav__link md-nav__link--active"> Testing builds </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" data-md-toggle=__nav_6 type=checkbox id=__nav_6 checked> <label class=md-nav__link for=__nav_6> Meta <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav aria-label=Meta data-md-level=1> <label class=md-nav__title for=__nav_6> <span class="md-nav__icon md-icon"></span> Meta </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../../meta/faq/ class=md-nav__link> FAQ </a> </li> <li class=md-nav__item> <a href=../../../meta/authors/ class=md-nav__link> Authors </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <a href=https://github.com/pypa/hatch/blob/master/docs/how-to/plugins/testing-builds.md title="Edit this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg> </a> <h1 id=testing-builds>Testing builds<a class=headerlink href=#testing-builds title="Permanent link">&para;</a></h1> <hr> <p>For testing <a href=../../../plugins/about/#hatchling>Hatchling plugins</a>, you'll usually want to generate a project to execute builds as a real user would. For example, as a minimal <a href=https://github.com/pytest-dev/pytest>pytest</a> fixture:</p> <div class=highlight><pre><span></span><code><span class=kn>from</span> <span class=nn>pathlib</span> <span class=kn>import</span> <span class=n>Path</span>
<span class=kn>import</span> <span class=nn>pytest</span>
<span class=nd>@pytest</span><span class=o>.</span><span class=n>fixture</span>
<span class=k>def</span> <span class=nf>new_project</span><span class=p>(</span><span class=n>tmp_path</span><span class=p>):</span>
<span class=n>project_dir</span> <span class=o>=</span> <span class=n>tmp_path</span> <span class=o>/</span> <span class=s1>&#39;my-app&#39;</span>
<span class=n>project_dir</span><span class=o>.</span><span class=n>mkdir</span><span class=p>()</span>
<span class=n>project_file</span> <span class=o>=</span> <span class=n>project_dir</span> <span class=o>/</span> <span class=s1>&#39;pyproject.toml&#39;</span>
<span class=n>project_file</span><span class=o>.</span><span class=n>write_text</span><span class=p>(</span>
<span class=sa>f</span><span class=s2>&quot;&quot;&quot;</span><span class=se>\</span>
<span class=s2>[build-system]</span>
<span class=s2>requires = [&quot;hatchling&quot;, &quot;hatch-plugin-name @ </span><span class=si>{</span><span class=n>Path</span><span class=o>.</span><span class=n>cwd</span><span class=p>()</span><span class=o>.</span><span class=n>as_uri</span><span class=p>()</span><span class=si>}</span><span class=s2>&quot;]</span>
<span class=s2>build-backend = &quot;hatchling.build&quot;</span>
<span class=s2>[project]</span>
<span class=s2>name = &quot;my-app&quot;</span>
<span class=s2>version = &quot;0.1.0&quot;</span>
<span class=s2>&quot;&quot;&quot;</span><span class=p>,</span>
<span class=n>encoding</span><span class=o>=</span><span class=s1>&#39;utf-8&#39;</span><span class=p>,</span>
<span class=p>)</span>
<span class=o>...</span>
</code></pre></div> <p>The issue with this is that after the first test session, the project will be forever cached by pip based on the file path. Therefore, subsequent tests runs will never use updated code.</p> <p>To invalidate the cache, copy your code to a new path for every test session:</p> <div class=highlight><pre><span></span><code><span class=kn>import</span> <span class=nn>shutil</span>
<span class=kn>from</span> <span class=nn>pathlib</span> <span class=kn>import</span> <span class=n>Path</span>
<span class=kn>from</span> <span class=nn>tempfile</span> <span class=kn>import</span> <span class=n>TemporaryDirectory</span>
<span class=kn>import</span> <span class=nn>pytest</span>
<span class=nd>@pytest</span><span class=o>.</span><span class=n>fixture</span><span class=p>(</span><span class=n>scope</span><span class=o>=</span><span class=s1>&#39;session&#39;</span><span class=p>)</span>
<span class=k>def</span> <span class=nf>plugin_dir</span><span class=p>():</span>
<span class=k>with</span> <span class=n>TemporaryDirectory</span><span class=p>()</span> <span class=k>as</span> <span class=n>d</span><span class=p>:</span>
<span class=n>directory</span> <span class=o>=</span> <span class=n>Path</span><span class=p>(</span><span class=n>d</span><span class=p>,</span> <span class=s1>&#39;plugin&#39;</span><span class=p>)</span>
<span class=n>shutil</span><span class=o>.</span><span class=n>copytree</span><span class=p>(</span>
<span class=n>Path</span><span class=o>.</span><span class=n>cwd</span><span class=p>(),</span> <span class=n>directory</span><span class=p>,</span> <span class=n>ignore</span><span class=o>=</span><span class=n>shutil</span><span class=o>.</span><span class=n>ignore_patterns</span><span class=p>(</span><span class=s1>&#39;.git&#39;</span><span class=p>)</span>
<span class=p>)</span>
<span class=k>yield</span> <span class=n>directory</span><span class=o>.</span><span class=n>resolve</span><span class=p>()</span>
<span class=nd>@pytest</span><span class=o>.</span><span class=n>fixture</span>
<span class=k>def</span> <span class=nf>new_project</span><span class=p>(</span><span class=n>tmp_path</span><span class=p>,</span> <span class=n>plugin_dir</span><span class=p>):</span>
<span class=n>project_dir</span> <span class=o>=</span> <span class=n>tmp_path</span> <span class=o>/</span> <span class=s1>&#39;my-app&#39;</span>
<span class=n>project_dir</span><span class=o>.</span><span class=n>mkdir</span><span class=p>()</span>
<span class=n>project_file</span> <span class=o>=</span> <span class=n>project_dir</span> <span class=o>/</span> <span class=s1>&#39;pyproject.toml&#39;</span>
<span class=n>project_file</span><span class=o>.</span><span class=n>write_text</span><span class=p>(</span>
<span class=sa>f</span><span class=s2>&quot;&quot;&quot;</span><span class=se>\</span>
<span class=s2>[build-system]</span>
<span class=s2>requires = [&quot;hatchling&quot;, &quot;hatch-plugin-name @ </span><span class=si>{</span><span class=n>plugin_dir</span><span class=o>.</span><span class=n>as_uri</span><span class=p>()</span><span class=si>}</span><span class=s2>&quot;]</span>
<span class=s2>build-backend = &quot;hatchling.build&quot;</span>
<span class=s2>[project]</span>
<span class=s2>name = &quot;my-app&quot;</span>
<span class=s2>version = &quot;0.1.0&quot;</span>
<span class=s2>&quot;&quot;&quot;</span><span class=p>,</span>
<span class=n>encoding</span><span class=o>=</span><span class=s1>&#39;utf-8&#39;</span><span class=p>,</span>
<span class=p>)</span>
<span class=o>...</span>
</code></pre></div> <div class="admonition note"> <p class=admonition-title>Note</p> <p>This example chooses to ignore copying <code>.git</code> for performance reasons. You may want to ignore more patterns, or copy only specific paths like <a href=https://github.com/hynek/hatch-fancy-pypi-readme/blob/main/tests/conftest.py>this plugin</a> does.</p> </div> <hr> <div class=md-source-file> <small> Last update: <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">August 6, 2022</span> </small> </div> </article> </div> </div> </main> <footer class=md-footer> <nav class="md-footer__inner md-grid" aria-label=Footer> <a href=../../environment/package-indices/ class="md-footer__link md-footer__link--prev" aria-label="Previous: Package indices" rel=prev> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </div> <div class=md-footer__title> <div class=md-ellipsis> <span class=md-footer__direction> Previous </span> Package indices </div> </div> </a> <a href=../../../meta/faq/ class="md-footer__link md-footer__link--next" aria-label="Next: FAQ" rel=next> <div class=md-footer__title> <div class=md-ellipsis> <span class=md-footer__direction> Next </span> FAQ </div> </div> <div class="md-footer__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> <div class=md-copyright__highlight> Copyright &copy; Ofek Lev 2017-present </div> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> <div class=md-social> <a href=https://github.com/ofek target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 480 512"><!-- Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"/></svg> </a> <a href=https://ofek.dev/words/ target=_blank rel=noopener title=ofek.dev class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M217.6 96.1c-12.95-.625-24.66 9.156-25.52 22.37-.88 13.23 9.12 24.63 22.32 24.63 79.53 5.188 148.4 74.09 153.6 153.6.828 12.69 11.39 22.43 23.94 22.43.516 0 1.047-.031 1.578-.063 13.22-.843 23.25-12.28 22.39-25.5C409.3 191.8 320.3 102.8 217.6 96.1zM224 0c-17.7 0-32 14.31-32 32s14.33 32 32 32c123.5 0 224 100.5 224 224 0 17.69 14.33 32 32 32s32-14.31 32-32C512 129.2 382.8 0 224 0zm-51.7 226.8c-14.6-2.9-28.3 9-28.3 23.8v50.37c0 10.25 7.127 18.37 16.75 21.1 18.13 6.75 31.26 24.38 31.26 44.1 0 26.5-21.5 47.1-48.01 47.1-26.5 0-48.01-21.5-48.01-47.1V120c0-13.25-10.75-23.1-24.01-23.1l-48.01.008C10.75 96.02 0 106.8 0 120v247.1c0 89.5 82.14 160.2 175 140.7 54.38-11.5 98.27-55.5 109.8-109.7 17.4-82-37-156.3-112.5-171.3z"/></svg> </a> <a href=https://twitter.com/Ofekmeister target=_blank rel=noopener title=twitter.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg> </a> <a href=https://www.linkedin.com/in/ofeklev/ target=_blank rel=noopener title=www.linkedin.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../../..", "features": ["navigation.sections", "navigation.expand", "navigation.tabs", "navigation.tabs.sticky", "navigation.instant"], "search": "../../../assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}, "version": {"provider": "mike"}}</script> <script src=../../../assets/javascripts/bundle.6c7ad80a.min.js></script> </body> </html>