1
0
Fork 0
cl-sites/lisp-docs.github.io/docs/howto/large-caveman.html

44 lines
21 KiB
HTML
Raw Normal View History

2024-03-13 23:00:32 +01:00
<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-howto/large-caveman/index" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">Structuring A Large caveman2 Project | Common Lisp Docs</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://lisp-docs.github.io/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" name="twitter:image" content="https://lisp-docs.github.io/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" property="og:url" content="https://lisp-docs.github.io/docs/howto/large-caveman"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="google-site-verification" content="Vzaw013_bfdKeUVG89Ch3W1zC9_vH9ID2dPB9Dz0vr0"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Structuring A Large caveman2 Project | Common Lisp Docs"><meta data-rh="true" name="description" content="How To Structure a Large caveman2 Project Into Multiple Modules?"><meta data-rh="true" property="og:description" content="How To Structure a Large caveman2 Project Into Multiple Modules?"><link data-rh="true" rel="icon" href="../../img/favicon.ico"><link data-rh="true" rel="canonical" href="large-caveman.html"><link data-rh="true" rel="alternate" href="large-caveman.html" hreflang="en"><link data-rh="true" rel="alternate" href="large-caveman.html" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://C1F2Q5VM6X-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="../../blog/rss.xml" title="Common Lisp Docs RSS Feed">
<link rel="alternate" type="application/atom+xml" href="../../blog/atom.xml" title="Common Lisp Docs Atom Feed">
<link rel="search" type="application/opensearchdescription+xml" title="Common Lisp Docs" href="../../opensearch.xml"><link rel="stylesheet" href="../../assets/css/styles.d316d1e5.css">
2024-07-18 17:20:57 +02:00
<script src="../../assets/js/runtime~main.8ea071ee.js" defer="defer"></script>
2024-03-13 23:00:32 +01:00
<script src="../../assets/js/main.8eecaa6d.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="large-caveman.html#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="../../index.html"><div class="navbar__logo"><img src="../../img/logo.svg" alt="Lisp Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="../../img/logo.svg" alt="Lisp Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Common Lisp Docs</b></a><a class="navbar__item navbar__link" href="../tutorial.html">Tutorial</a><a href="../../cl-language-reference/index.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Technical Reference</a><a class="navbar__item navbar__link" href="../whylisp.html">Why Lisp?</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="../howto.html">Guides</a></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="../contribute.html">Contribute!</a><a class="navbar__item navbar__link" href="../help.html">Getting Help</a><a class="navbar__item navbar__link" href="../about.html">About</a><a class="navbar__item navbar__link" href="../../blog.html">Blog</a><a href="https://github.com/lisp-docs" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" c
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-structure-a-large-caveman2-project-into-multiple-modules">How To Structure a Large caveman2 Project Into Multiple Modules?<a href="large-caveman.html#how-to-structure-a-large-caveman2-project-into-multiple-modules" class="hash-link" aria-label="Direct link to How To Structure a Large caveman2 Project Into Multiple Modules?" title="Direct link to How To Structure a Large caveman2 Project Into Multiple Modules?"></a></h2>
<p>How can I go about splitting large parts of a web app into modules to make it more manageable for writing <code>.asd</code> files and separating functionality.</p>
<p>This is to avoid importing every file in the <code>.asd</code> file and prevent it from becoming bloated and unmanageable.</p>
<p>For example, say I want to have an authentication module which has its own classes, routes, and views: How can I define it in a system say in <code>/src/auth/auth.asd</code> and be able to use those routes in the main web app by importing it?</p>
<p>To use another package to define routes is itself not so clearly documented: <a href="https://stackoverflow.com/questions/76330818/how-to-define-caveman2-routes-in-multiple-files-packages/76332385#76332385" target="_blank" rel="noopener noreferrer">https://stackoverflow.com/questions/76330818/how-to-define-caveman2-routes-in-multiple-files-packages/76332385#76332385</a></p>
<p>But given that defroute is expecting an <code>*app*</code> it looks like an app should be created as a caveman2 project, and then modules created outside of the project, and then another system should import the caveman2 project as a system, and then the other modules would depend on the caveman2 project as a base.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="answer">Answer<a href="large-caveman.html#answer" class="hash-link" aria-label="Direct link to Answer" title="Direct link to Answer"></a></h2>
<p>The way to do it is to add a <code>my-project.base.asd</code> package which contains</p>
<ul>
<li><code>config.lisp</code></li>
<li><code>db.lisp</code></li>
<li><code>view.lisp</code></li>
<li><code>web.lisp</code></li>
<li><code>main.lisp</code></li>
</ul>
<p>Then the original will contain the dependency on this <code>my-project.base.asd</code> and any other asd projects you declare. That way you can make smaller system definition files and encourage proper breaking up of the application code into more independent modules you can reuse over applications.</p>
<p>A key thing to think about here if you want to make your modules really independent is to not make them depend on the base system. For controllers, it gets tricky because of the macro <code>defroute</code>. So probably a good approach is make a new macro that will instead make a list of routes to be defined once a <code>*app*</code> variable is provided, and then call the ningle function to register a route (which is what defroute does when macroexpanded) on all those routes to be defined.</p>
<p>So the <code>my-project.asd</code> file will have a few dependencies:</p>
<ul>
<li><code>my-project.base</code></li>
<li><code>my-project.auth</code> (for example of an independent module which would declare routes etc)</li>
<li><code>my-project.main</code> which would then tie in auth into the project and would call some function/macro defined in the <code>my-project.auth</code> package and pass it the <code>my-project.web:*web*</code> app variable and define all relevant routes.</li>
</ul>
<p>Note that in this example, if you are defining some <code>user</code> class or anything that is persisted on the db, the <code>my-project.main</code> will also be responsible for executing the code to persist that class exported or extend it applying specific project related data and then persist it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="further-reading">Further Reading<a href="large-caveman.html#further-reading" class="hash-link" aria-label="Direct link to Further Reading" title="Direct link to Further Reading"></a></h2>
2024-07-18 17:20:57 +02:00
<p>Note that this advice is following the <a href="../tutorial/projects/structuring_large_projects.html">more traditional common lisp way of structuring projects</a>. Check out the <a href="../tutorial/projects/package_inferred.html">package inferred systems</a> guide for a different approach.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/lisp-docs/lisp-docs.github.io/tree/main/docs/howto/large-caveman/index.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">Last updated<!-- --> by <b>daninus14</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="webdev-hunchentoot/start.html"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Getting Started</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="large-caveman.html#how-to-structure-a-large-caveman2-project-into-multiple-modules" class="table-of-contents__link toc-highlight">How To Structure a Large caveman2 Project Into Multiple Modules?</a></li><li><a href="large-caveman.html#answer" class="table-of-contents__link toc-highlight">Answer</a></li><li><a href="large-caveman.html#further-reading" class="table-of-contents__link toc-highlight">Further Reading</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="../tutorial.html">Common Lisp Tutorial</a></li><li class="footer__item"><a href="../../cl-language-reference/index.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Common Lisp Technical Reference</a></li><li class="footer__item"><a class="footer__link-item" href="../help.html">Help</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/common-lisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://discord.gg/hhk46CE" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.reddit.com/r/common_lisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">Reddit<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://irclog.tymoon.eu/libera/commonlisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">IRC<svg width="
2024-03-13 23:00:32 +01:00
</body>
</html>