2022-01-30 20:34:01 +00:00
<!doctype html>
< html lang = "en" class = "no-js" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no" >
< meta name = "generator" content = "Hugo 0.91.2" / >
< meta name = "robots" content = "index, follow" >
2022-01-30 20:58:50 +00:00
< link rel = "shortcut icon" href = "/favicons/favicon.ico" >
< link rel = "apple-touch-icon" href = "/favicons/apple-touch-icon-180x180.png" sizes = "180x180" >
< link rel = "icon" type = "image/png" href = "/favicons/favicon-16x16.png" sizes = "16x16" >
< link rel = "icon" type = "image/png" href = "/favicons/favicon-32x32.png" sizes = "32x32" >
< link rel = "icon" type = "image/png" href = "/favicons/android-36x36.png" sizes = "36x36" >
< link rel = "icon" type = "image/png" href = "/favicons/android-48x48.png" sizes = "48x48" >
< link rel = "icon" type = "image/png" href = "/favicons/android-72x72.png" sizes = "72x72" >
< link rel = "icon" type = "image/png" href = "/favicons/android-96x96.png" sizes = "96x96" >
< link rel = "icon" type = "image/png" href = "/favicons/android-144x144.png" sizes = "144x144" >
< link rel = "icon" type = "image/png" href = "/favicons/android-192x192.png" sizes = "192x192" >
2022-01-30 20:34:01 +00:00
< title > Hello world! | Luet< / title >
< meta name = "description" content = "Everything starts from an & # 34 ; Hello ! & # 34 ;
">
< meta property = "og:title" content = "Hello world!" / >
< meta property = "og:description" content = "Everything starts from an & # 34 ; Hello ! & # 34 ;
" />
< meta property = "og:type" content = "article" / >
2022-01-30 20:58:50 +00:00
< meta property = "og:url" content = "https://luet.io/docs/tutorials/hello_world/" / > < meta property = "article:section" content = "docs" / >
2022-01-30 20:34:01 +00:00
< meta property = "article:published_time" content = "2017-01-04T00:00:00+00:00" / >
2024-06-24 13:14:18 +00:00
< meta property = "article:modified_time" content = "2024-06-24T15:13:44+02:00" / > < meta property = "og:site_name" content = "Luet" / >
2022-01-30 20:34:01 +00:00
< meta itemprop = "name" content = "Hello world!" >
< meta itemprop = "description" content = "Everything starts from an & # 34 ; Hello ! & # 34 ;
">< meta itemprop = "datePublished" content = "2017-01-04T00:00:00+00:00" / >
2024-06-24 13:14:18 +00:00
< meta itemprop = "dateModified" content = "2024-06-24T15:13:44+02:00" / >
2022-01-30 20:34:01 +00:00
< meta itemprop = "wordCount" content = "580" >
< meta itemprop = "keywords" content = "" / > < meta name = "twitter:card" content = "summary" / >
< meta name = "twitter:title" content = "Hello world!" / >
< meta name = "twitter:description" content = "Everything starts from an & # 34 ; Hello ! & # 34 ;
"/>
2024-06-24 13:14:18 +00:00
< link rel = "preload" href = "/scss/main.min.f944e6adf1b7822650022e3aa7789905c53fc9e2e8a936de4e5294f297b5677c.css" as = "style" >
< link href = "/scss/main.min.f944e6adf1b7822650022e3aa7789905c53fc9e2e8a936de4e5294f297b5677c.css" rel = "stylesheet" integrity = "" >
2022-01-30 20:34:01 +00:00
< script
src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK"
crossorigin="anonymous">< / script >
< script
src="https://unpkg.com/lunr@2.3.9/lunr.min.js"
integrity="sha384-203J0SNzyqHby3iU6hzvzltrWi/M41wOP5Gu+BiJMz5nwKykbkUx8Kp7iti0Lpli"
crossorigin="anonymous">< / script >
< script type = "application/javascript" >
var doNotTrack = false;
if (!doNotTrack) {
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-00000000-0', 'auto');
ga('send', 'pageview');
}
< / script >
< script async src = 'https://www.google-analytics.com/analytics.js' > < / script >
< / head >
< body class = "td-page" >
< header >
< nav class = "js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" >
2022-01-30 20:58:50 +00:00
< a class = "navbar-brand" href = "/" >
2022-01-30 20:34:01 +00:00
< span class = "navbar-logo" > < svg id = "Layer_1" xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 500 500" style = "enable-background:new 0 0 500 500" > < g > < path style = "fill:#fff" d = "M116.8525 421.9722c-5.7041.0-10.3442-4.3127-10.3442-9.6129V88.183c0-5.3002 4.6401-9.6117 10.3442-9.6117H320.858c3.0347.0 9.3959.5498 11.7506 2.6302l.3545.3442 58.905 63.2912c2.3101 2.491 2.9202 8.4928 2.9202 11.3184v256.2039c0 5.3002-4.6407 9.6129-10.3436 9.6129H116.8525z" / > < g > < g > < g > < path style = "fill:#767676" d = "M384.4445 423.2066H116.852c-6.3839.0-11.5786-4.8658-11.5786-10.8474V88.1831c0-5.9804 5.1947-10.8461 11.5786-10.8461h204.0062c.377.0 9.2786.0329 12.568 2.9389l.3947.3833 58.9508 63.337c3.2135 3.4652 3.2514 11.7924 3.2514 12.1593v256.2036C396.0231 418.3408 390.8284 423.2066 384.4445 423.2066zM116.5079 411.9189c.0848.0278.1999.0531.3441.0531h267.5925c.1442.0.2581-.0253.3441-.0531V156.1556c-.0076-.9033-.3593-3.7347-.7034-5.0037l-57.6527-61.9416c-1.4651-.3176-4.4533-.6389-5.5742-.6389H116.852c-.143.0-.2594.024-.3441.0531V411.9189zm267.4533-261.149zM327.0321 89.371v.0013V89.371z" / > < / g > < / g > < / g > < g > < g > < path style = "fill:#5b7fc0" d = "M189.0874 210.1754l.0012-.0012c7.7751.0012 15.0295 4.1862 18.932 10.9234 1.9177 3.3159 2.9305 7.1011 2.9293 10.9378.0 5.8394-2.2733 11.3304-6.4032 15.4604-4.1288 4.1288-9.6186 6.4032-15.458 6.4032s-11.328-2.2733-15.458-6.4032-6.4032-9.6186-6.4056-15.4628c.0012-6.025 2.454-11.4897 6.4116-15.4473C177.5953 212.627 183.0601 210.1742 189.0874 210.1754zm7.993 21.8576c.0012-1.4042-.3687-2.7868-1.063-3.9887-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019-4.4077.0024-7.993 3.5877-7.993 7.993.0 2.1356.832 4.1431 2.3427 5.6539 1.5083 1.5083 3.5159 2.3403 5.6503 2.3415 2.1356.0 4.1443-.8308 5.6539-2.3403S197.0816 234.1722 197.0804 232.033z" / > < path style = "opacity:.3;fill:#fff" d = "M189.0898 210.176c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3136 2.9377 7.0988 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8066-21.8612-21.8613.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 212.6276 183.0612 210.176 189.0898 210.176zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 236.239 197.0839 234.2399 197.0839 232.0372z" / > < g > < defs > < path id = "SVGID_1_" d = "M194.7376 237.6875c-1.4461 1.4461-3.4452 2.3439-5.6479 2.3439-4.4077-.0024-7.9918-3.5865-7.9942-7.9942.0024-4.4125 3.5937-7.999 7.9942-7.9942 2.8443.0 5.497 1.5323 6.924 3.9983.6991 1.2067 1.0702 2.5881 1.0702 3.9959C197.0839 234.2399 196.1861 236.239 194.7376 237.6875z" / > < / defs > < clipPath id = "SVGID_2_" > < use xlink:href = "#SVGID_1_" style = "overflow:visible" / > < / clipPath > < path style = "clip-path:url(#SVGID_2_);fill:#fff" d = "M190.0704 225.0237c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9546.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.663-2.8588-6.116.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C193.7885 225.7247 191.9774 225.0237 190.0704 225.0237z" / > < path style = "opacity:.13;clip-path:url(#SVGID_2_);fill:#020202" d = "M190.0704 225.0237c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9546.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.663-2.8588-6.116.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C193.7885 225.7247 191.9774 225.0237 190.0704 225.0237z" / > < / g > < g > < defs > < path id = "SVGID_3_" d = "M189.0898 210.176c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3136 2.9377 7.0988 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8066-21.8612-21.8613.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 212.6276 183.0612 210.176 189.0898 210.176zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 236.239 197.0839 234.2399 197.0839 232.0372z" / > < / defs > < clipPath id = "SVGID_4_" > < use xlink:href = "#SVGID_3_" style = "overflo
< / a >
< div class = "td-navbar-nav-scroll ml-md-auto" id = "main_navbar" >
< ul class = "navbar-nav mt-2 mt-lg-0" >
< li class = "nav-item mr-4 mb-2 mb-lg-0" >
2022-01-30 20:58:50 +00:00
< a class = "nav-link" href = "/about/" > < span > About< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< li class = "nav-item mr-4 mb-2 mb-lg-0" >
2022-01-30 20:58:50 +00:00
< a class = "nav-link active" href = "/docs/" > < span class = "active" > Documentation< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< li class = "nav-item mr-4 mb-2 mb-lg-0" >
2022-01-30 20:58:50 +00:00
< a class = "nav-link" href = "/blog/" > < span > Blog< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< li class = "nav-item mr-4 mb-2 mb-lg-0" >
2022-01-30 20:58:50 +00:00
< a class = "nav-link" href = "/community/" > < span > Community< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< li class = "nav-item mr-4 mb-2 mb-lg-0" >
< a class = "nav-link" href = "https://github.com/mudler/luet/contribute" target = "_blank" > < i class = 'fab fa-github' > < / i > < span > Contribution guidelines< / span > < / a >
< / li >
< / ul >
< / div >
< div class = "navbar-nav d-none d-lg-block" > < input
type="search"
class="form-control td-search-input"
placeholder=" Search this site…"
aria-label="Search this site…"
autocomplete="off"
2023-08-02 16:15:03 +00:00
data-offline-search-index-json-src="/offline-search-index.4fe7714e302eef4501ae919bdbad5ce4.json"
2022-01-30 20:34:01 +00:00
data-offline-search-base-href="/"
data-offline-search-max-results="10"
>
< / div >
< / nav >
< / header >
< div class = "container-fluid td-outer" >
< div class = "td-main" >
< div class = "row flex-xl-nowrap" >
< aside class = "col-12 col-md-3 col-xl-2 td-sidebar d-print-none" >
< div id = "td-sidebar-menu" class = "td-sidebar__inner" >
< form class = "td-sidebar__search d-flex align-items-center" >
< input
type="search"
class="form-control td-search-input"
placeholder=" Search this site…"
aria-label="Search this site…"
autocomplete="off"
2023-08-02 16:15:03 +00:00
data-offline-search-index-json-src="/offline-search-index.4fe7714e302eef4501ae919bdbad5ce4.json"
2022-01-30 20:34:01 +00:00
data-offline-search-base-href="/"
data-offline-search-max-results="10"
>
< button class = "btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type = "button" data-toggle = "collapse" data-target = "#td-section-nav" aria-controls = "td-docs-nav" aria-expanded = "false" aria-label = "Toggle section navigation" >
< / button >
< / form >
< nav class = "collapse td-sidebar-nav" id = "td-section-nav" >
< ul class = "td-sidebar-nav__section pr-md-3 ul-0" >
2022-01-30 20:58:50 +00:00
< li class = "td-sidebar-nav__section-title td-sidebar-nav__section with-child active-path" id = "m-docs-li" >
< a href = "/docs/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section tree-root" id = "m-docs" > < span class = "" > Documentation< / span > < / a >
2022-01-30 20:34:01 +00:00
< ul class = "ul-1" >
2022-01-30 20:58:50 +00:00
< li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsgetting-started-li" >
< a href = "/docs/getting-started/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section" id = "m-docsgetting-started" > < span class = "" > Getting Started< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section with-child" id = "m-docsconcepts-li" >
< a href = "/docs/concepts/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section" id = "m-docsconcepts" > < span class = "" > Concepts< / span > < / a >
2022-01-30 20:34:01 +00:00
< ul class = "ul-2 foldable" >
2022-01-30 20:58:50 +00:00
< li class = "td-sidebar-nav__section-title td-sidebar-nav__section with-child" id = "m-docsconceptsoverview-li" >
< a href = "/docs/concepts/overview/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section" id = "m-docsconceptsoverview" > < span class = "" > Overview< / span > < / a >
2022-01-30 20:34:01 +00:00
< ul class = "ul-3 foldable" >
2022-01-30 20:58:50 +00:00
< li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptsoverviewbuild_packages-li" >
< a href = "/docs/concepts/overview/build_packages/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptsoverviewbuild_packages" > < span class = "" > Building packages< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptsoverviewrepositories-li" >
< a href = "/docs/concepts/overview/repositories/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptsoverviewrepositories" > < span class = "" > Creating Luet repositories< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptsoverviewusage-li" >
< a href = "/docs/concepts/overview/usage/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptsoverviewusage" > < span class = "" > CLI usage< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptsoverviewconstraints-li" >
< a href = "/docs/concepts/overview/constraints/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptsoverviewconstraints" > < span class = "" > CSP, SAT & & RL< / span > < / a >
2023-08-02 16:15:03 +00:00
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptsoverviewconfiguration-li" >
< a href = "/docs/concepts/overview/configuration/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptsoverviewconfiguration" > < span class = "" > < / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< / ul >
2022-01-30 20:58:50 +00:00
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section with-child" id = "m-docsconceptspackages-li" >
< a href = "/docs/concepts/packages/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section" id = "m-docsconceptspackages" > < span class = "" > Packages< / span > < / a >
2022-01-30 20:34:01 +00:00
< ul class = "ul-3 foldable" >
2022-01-30 20:58:50 +00:00
< li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptspackagesspecfile-li" >
< a href = "/docs/concepts/packages/specfile/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptspackagesspecfile" > < span class = "" > Specfile< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptspackagestemplates-li" >
< a href = "/docs/concepts/packages/templates/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptspackagestemplates" > < span class = "" > Templated packages< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptspackagescollections-li" >
< a href = "/docs/concepts/packages/collections/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsconceptspackagescollections" > < span class = "" > Collections< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< / ul >
2022-01-30 20:58:50 +00:00
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsconceptsplugins-and-extensions-li" >
< a href = "/docs/concepts/plugins-and-extensions/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section" id = "m-docsconceptsplugins-and-extensions" > < span class = "" > Plugins and Extensions< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< / ul >
2022-01-30 20:58:50 +00:00
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section with-child active-path" id = "m-docstutorials-li" >
< a href = "/docs/tutorials/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section" id = "m-docstutorials" > < span class = "" > Tutorials< / span > < / a >
2022-01-30 20:34:01 +00:00
< ul class = "ul-2 foldable" >
2022-01-30 20:58:50 +00:00
< li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child active-path" id = "m-docstutorialshello_world-li" >
< a href = "/docs/tutorials/hello_world/" class = "align-left pl-0 active td-sidebar-link td-sidebar-link__page" id = "m-docstutorialshello_world" > < span class = "td-sidebar-nav-active-item" > Hello world!< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docstutorialsbuild_package-li" >
< a href = "/docs/tutorials/build_package/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docstutorialsbuild_package" > < span class = "" > Build a package< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< / ul >
2022-01-30 20:58:50 +00:00
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section with-child" id = "m-docsresources-li" >
< a href = "/docs/resources/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__section" id = "m-docsresources" > < span class = "" > Resources< / span > < / a >
2022-01-30 20:34:01 +00:00
< ul class = "ul-2 foldable" >
2022-01-30 20:58:50 +00:00
< li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsresourcesarm-li" >
< a href = "/docs/resources/arm/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsresourcesarm" > < span class = "" > ARM images< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsresourcesbuilding-li" >
< a href = "/docs/resources/building/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsresourcesbuilding" > < span class = "" > Building< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsresourcesfaq-li" >
< a href = "/docs/resources/faq/" title = "Frequently Asked Questions" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsresourcesfaq" > < span class = "" > FAQ< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsresourcesscratch-li" >
< a href = "/docs/resources/scratch/" title = "Images from scratch" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsresourcesscratch" > < span class = "" > ScratchImages< / span > < / a >
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docsresourcesreferences-li" >
< a href = "/docs/resources/references/" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docsresourcesreferences" > < span class = "" > References< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< / ul >
2022-01-30 20:58:50 +00:00
< / li > < li class = "td-sidebar-nav__section-title td-sidebar-nav__section without-child" id = "m-docscontribution-guidelines-li" >
< a href = "/docs/contribution-guidelines/" title = "Contributing" class = "align-left pl-0 td-sidebar-link td-sidebar-link__page" id = "m-docscontribution-guidelines" > < span class = "" > Contribution guidelines< / span > < / a >
2022-01-30 20:34:01 +00:00
< / li >
< / ul >
< / li >
< / ul >
< / nav >
< / div >
< / aside >
< aside class = "d-none d-xl-block col-xl-2 td-sidebar-toc d-print-none" >
< div class = "td-page-meta ml-2 pb-1 pt-2 mb-0" >
< a href = "https://github.com/mudler/luet/tree/master/docs/content/en/docs/Tutorials/hello_world.md" class = "td-page-meta--view" target = "_blank" rel = "noopener" > < i class = "fa fa-file-alt fa-fw" > < / i > View page source< / a >
< a href = "https://github.com/mudler/luet/edit/master/docs/content/en/docs/Tutorials/hello_world.md" class = "td-page-meta--edit" target = "_blank" rel = "noopener" > < i class = "fa fa-edit fa-fw" > < / i > Edit this page< / a >
< a href = "https://github.com/mudler/luet/new/master/docs/content/en/docs/Tutorials/hello_world.md?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+top+of+the+page+%28weight+controls+how+its+ordered+amongst+other+pages+in+the+same+directory%3B+lowest+number+first%29.%0A%2A+Add+a+good+commit+message+at+the+bottom+of+the+page+%28%3C80+characters%3B+use+the+extended+description+field+for+more+detail%29.%0A%2A+Create+a+new+branch+so+you+can+preview+your+new+file+and+request+a+review+via+Pull+Request.%0A" class = "td-page-meta--child" target = "_blank" rel = "noopener" > < i class = "fa fa-edit fa-fw" > < / i > Create child page< / a >
< a href = "https://github.com/mudler/luet/issues/new?title=Hello%20world!" class = "td-page-meta--issue" target = "_blank" rel = "noopener" > < i class = "fab fa-github fa-fw" > < / i > Create documentation issue< / a >
< a href = "https://github.com/mudler/luet/issues/new" class = "td-page-meta--project-issue" target = "_blank" rel = "noopener" > < i class = "fas fa-tasks fa-fw" > < / i > Create project issue< / a >
< / div >
< / aside >
< main class = "col-12 col-md-9 col-xl-8 pl-md-5" role = "main" >
< div class = "td-content" >
< h1 > Hello world!< / h1 >
< div class = "lead" > Everything starts from an “ Hello!” < / div >
< header class = "article-meta" >
< / header >
< p > This article will guide you to build your first package with Luet!
For this purpose, we have picked a real-world example: < a href = "https://github.com/gogs/gogs" > gogs< / a > which is a “ painless self-hosted Git service” , an open-source alternative to Github.< / p >
< p > Gogs is written in Golang, and we need a working Golang version in order to build it.< / p >
< p > Here you can see a live recorded session of this tutorial:< / p >
< script id = "asciicast-388348" src = "https://asciinema.org/a/388348.js" data-autoplay = "true" data-size = "small" data-cols = "120" data-rows = "40" async > < / script >
< h1 id = "define-a-luet-tree" > Define a Luet tree< / h1 >
< p > Everything starts from a Luet tree. A Luet tree is just a directory containing one (or more) Luet specfile, here on we assume that you are working in a dedicated folder (e.g. < code > ~/demo< / code > ) in your system.< / p >
< p > Let’ s create then a package that will be our base to build other packages from now on, we have picked < code > busybox< / code > here - it is really small and enough for our purpose.< / p >
< h2 id = "busybox" > busybox< / h2 >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > mkdir busybox
< / code > < / pre > < / div > < p > Let’ s now write the build specification, which is just containing the image tag that we are referencing to< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > cat < span style = "color:#4e9a06" > < < EOF > busybox/build.yaml
< / span > < span style = "color:#4e9a06" > image: " busybox:{{.Values.version}}-glibc"
< / span > < span style = "color:#4e9a06" > EOF< / span >
< / code > < / pre > < / div > < p > Now, lets write the < code > definition.yaml< / code > , which contains the metadata information about our package ( e.g. how we refer to it with luet, the version, and so on )< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > cat < span style = "color:#4e9a06" > < < EOF > busybox/definition.yaml
< / span > < span style = "color:#4e9a06" > category: " distro"
< / span > < span style = "color:#4e9a06" > name: " busybox"
< / span > < span style = "color:#4e9a06" > version: " 1.33.0"
< / span > < span style = "color:#4e9a06" > EOF< / span >
< / code > < / pre > < / div > < h2 id = "golang" > golang< / h2 >
< p > We need now golang in order to build < code > gogs< / code > . Let’ s declare then a golang package:< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > mkdir golang
< / code > < / pre > < / div > < p > And a build specfile, which is simply fetch golang from < a href = "https://golang.org" > https://golang.org< / a > and installing it in the busybox container:< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > cat < span style = "color:#4e9a06" > < < EOF > golang/build.yaml
< / span > < span style = "color:#4e9a06" > requires:
< / span > < span style = "color:#4e9a06" > - category: " distro"
< / span > < span style = "color:#4e9a06" > name: " busybox"
< / span > < span style = "color:#4e9a06" > version: " > =0"
< / span > < span style = "color:#4e9a06" >
< / span > < span style = "color:#4e9a06" > prelude:
< / span > < span style = "color:#4e9a06" > - wget https://golang.org/dl/go{{.Values.version}}.linux-{{.Values.arch}}.tar.gz -O golang.tar.gz
< / span > < span style = "color:#4e9a06" > - mkdir /usr/local
< / span > < span style = "color:#4e9a06" > steps:
< / span > < span style = "color:#4e9a06" > - tar -C /usr/local -xzf golang.tar.gz
< / span > < span style = "color:#4e9a06" > EOF< / span >
< / code > < / pre > < / div > < p > Note how we < code > require< / code > busybox. The Golang container will now be based from busybox, and the < code > prelude< / code > and < code > steps< / code > fields will be executed in that context.< / p >
< p > And finally let’ s write the golang metadata files, so we can refer to it from other packages< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > cat < span style = "color:#4e9a06" > < < EOF > golang/definition.yaml
< / span > < span style = "color:#4e9a06" > name: " go"
< / span > < span style = "color:#4e9a06" > category: " dev-lang"
< / span > < span style = "color:#4e9a06" > version: " 1.15.6"
< / span > < span style = "color:#4e9a06" > arch: " amd64"
< / span > < span style = "color:#4e9a06" > EOF< / span >
< / code > < / pre > < / div > < h2 id = "gogs" > gogs< / h2 >
< p > Finally we can write the gogs package definition!< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > mkdir gogs
< / code > < / pre > < / div > < p > The build specfile, will just fetch the < code > gogs< / code > sources at a given version (specified in the < code > definition.yaml< / code > ) and build the sources with go:< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > cat < span style = "color:#4e9a06" > < < ' EOF' > gogs/build.yaml
< / span > < span style = "color:#4e9a06" > requires:
< / span > < span style = "color:#4e9a06" > - category: " dev-lang"
< / span > < span style = "color:#4e9a06" > name: " go"
< / span > < span style = "color:#4e9a06" > version: " > =0"
< / span > < span style = "color:#4e9a06" > env:
< / span > < span style = "color:#4e9a06" > - GOPATH=" /go"
< / span > < span style = "color:#4e9a06" > - GOGSPATH=" $GOPATH/src/github.com/gogs/gogs"
< / span > < span style = "color:#4e9a06" > - PATH=$PATH:/usr/local/go/bin
< / span > < span style = "color:#4e9a06" > - CGO_ENABLED=0
< / span > < span style = "color:#4e9a06" > prelude:
< / span > < span style = "color:#4e9a06" > - mkdir -p $GOPATH/src/github.com/gogs
< / span > < span style = "color:#4e9a06" > - wget https://github.com/gogs/gogs/archive/v{{.Values.version}}.tar.gz -O - | tar -xzf - -C ./ & & mv gogs-{{.Values.version}} $GOGSPATH
< / span > < span style = "color:#4e9a06" > steps:
< / span > < span style = "color:#4e9a06" > - mkdir /usr/bin
< / span > < span style = "color:#4e9a06" > - cd $GOGSPATH & & go build & & mv gogs /usr/bin/gogs
< / span > < span style = "color:#4e9a06" > excludes:
< / span > < span style = "color:#4e9a06" > # Cache generated by Golang
< / span > < span style = "color:#4e9a06" > - ^/root
< / span > < span style = "color:#4e9a06" > EOF< / span >
< / code > < / pre > < / div > < p > And the metadata, in this way we can refer to gogs in a Luet tree:< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > cat < span style = "color:#4e9a06" > < < EOF > gogs/definition.yaml
< / span > < span style = "color:#4e9a06" > category: " dev-vcs"
< / span > < span style = "color:#4e9a06" > name: " gogs"
< / span > < span style = "color:#4e9a06" > version: " 0.11.91"
< / span > < span style = "color:#4e9a06" > EOF< / span >
< / code > < / pre > < / div > < h1 id = "build-packages" > Build packages< / h1 >
< p > The simplest and mostly immediate way to build packages, is running < code > luet build < packagename> < / code > in the same folder you have your Luet tree.< / p >
< p > In this case, to build gogs and its deps, we can do:< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > luet build dev-vcs/gogs
< / code > < / pre > < / div > < p > And that’ s it! you will find the package archives in < code > build/< / code > in the same folder where you started the command.< / p >
< p > You will see that Luet generates not only archives with the file resulting to your builds, but it will also generate metadata files (ending with < code > .metadata.yaml< / code > ) that contains additional metadata information about your build and the package itself (e.g. checksums).< / p >
< p > You can use tools like < a href = "https://github.com/mikefarah/yq" > yq< / a > to inspect those:< / p >
< div class = "highlight" > < pre tabindex = "0" style = "background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-bash" data-lang = "bash" > yq r build/gogs-dev-vcs-0.11.91.metadata.yaml checksums
< / code > < / pre > < / div > < p > Now if you want to consume the artifacts just built with < code > luet install< / code > , you can create a repository with < code > luet create-repo< / code > .< / p >
< style >
.feedback--answer {
display: inline-block;
}
.feedback--answer-no {
margin-left: 1em;
}
.feedback--response {
display: none;
margin-top: 1em;
}
.feedback--response__visible {
display: block;
}
< / style >
< div class = "d-print-none" >
< h2 class = "feedback--title" > Feedback< / h2 >
< p class = "feedback--question" > Was this page helpful?< / p >
< button class = "btn btn-primary mb-4 feedback--answer feedback--answer-yes" > Yes< / button >
< button class = "btn btn-primary mb-4 feedback--answer feedback--answer-no" > No< / button >
< p class = "feedback--response feedback--response-yes" >
Glad to hear it! Please < a href = "https://github.com/Luet-lab/docs/issues/new" > tell us how we can improve< / a > .
< / p >
< p class = "feedback--response feedback--response-no" >
Sorry to hear that. Please < a href = "https://github.com/Luet-lab/docs/issues/new" > tell us how we can improve< / a > .
< / p >
< / div >
< script >
const yesButton = document.querySelector('.feedback--answer-yes');
const noButton = document.querySelector('.feedback--answer-no');
const yesResponse = document.querySelector('.feedback--response-yes');
const noResponse = document.querySelector('.feedback--response-no');
const disableButtons = () => {
yesButton.disabled = true;
noButton.disabled = true;
};
const sendFeedback = (value) => {
if (typeof ga !== 'function') return;
const args = {
command: 'send',
hitType: 'event',
category: 'Helpful',
action: 'click',
label: window.location.pathname,
value: value
};
ga(args.command, args.hitType, args.category, args.action, args.label, args.value);
};
yesButton.addEventListener('click', () => {
yesResponse.classList.add('feedback--response__visible');
disableButtons();
sendFeedback(1);
});
noButton.addEventListener('click', () => {
noResponse.classList.add('feedback--response__visible');
disableButtons();
sendFeedback(0);
});
< / script >
< br / >
< div class = "text-muted mt-5 pt-3 border-top" >
2024-06-24 13:14:18 +00:00
Last modified June 24, 2024: < a href = "https://github.com/mudler/luet/commit/afce4b3ce08722d3476e17fc8648790aacf7d153" > ci: bump golang (#359) (afce4b3)< / a >
2022-01-30 20:34:01 +00:00
< / div >
< / div >
< / main >
< / div >
< / div >
< footer class = "bg-dark py-5 row d-print-none" >
< div class = "container-fluid mx-sm-5" >
< div class = "row" >
< div class = "col-6 col-sm-4 text-xs-center order-sm-2" >
< / div >
< div class = "col-6 col-sm-4 text-right text-xs-center order-sm-3" >
< ul class = "list-inline mb-0" >
< li class = "list-inline-item mx-2 h3" data-toggle = "tooltip" data-placement = "top" title = "GitHub" aria-label = "GitHub" >
< a class = "text-white" target = "_blank" rel = "noopener" href = "https://github.com/mudler/luet" aria-label = "GitHub" >
< i class = "fab fa-github" > < / i >
< / a >
< / li >
< li class = "list-inline-item mx-2 h3" data-toggle = "tooltip" data-placement = "top" title = "Slack" aria-label = "Slack" >
< a class = "text-white" target = "_blank" rel = "noopener" href = "https://join.slack.com/t/luet/shared_invite/enQtOTQxMjcyNDQ0MDUxLWQ5ODVlNTI1MTYzNDRkYzkyYmM1YWE5YjM0NTliNDEzNmQwMTkxNDRhNDIzM2Y5NDBlOTZjZTYxYWQyNDE4YzY" aria-label = "Slack" >
< i class = "fab fa-slack" > < / i >
< / a >
< / li >
< / ul >
< / div >
< div class = "col-12 col-sm-4 text-center py-2 order-sm-2" >
2024-03-15 08:27:06 +00:00
< small class = "text-white" > © 2024 Ettore Di Giacinto All Rights Reserved< / small >
2022-01-30 20:34:01 +00:00
< small class = "ml-1" > < a href = "https://policies.google.com/privacy" target = "_blank" rel = "noopener" > Privacy Policy< / a > < / small >
2022-01-30 20:58:50 +00:00
< p class = "mt-2" > < a href = "/about/" > About Luet< / a > < / p >
2022-01-30 20:34:01 +00:00
< / div >
< / div >
< / div >
< / footer >
< / div >
< script src = "https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"
integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN"
crossorigin="anonymous">< / script >
< script src = "https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.min.js"
integrity="sha512-UR25UO94eTnCVwjbXozyeVd6ZqpaAE9naiEUBK/A+QDbfSTQFhPGj5lOR6d8tsgbBk84Ggb5A3EkjsOgPRPcKA=="
crossorigin="anonymous">< / script >
2022-01-30 20:58:50 +00:00
< script src = '/js/tabpane-persist.js' > < / script >
2022-01-30 20:34:01 +00:00
2022-01-30 20:58:50 +00:00
< script src = "/js/main.min.8ab8f81ff7e1454d30024cd6f956d4d341c3a97e2a673f988065f2ee4e147922.js" integrity = "sha256-irj4H/fhRU0wAkzW+VbU00HDqX4qZz+YgGXy7k4UeSI=" crossorigin = "anonymous" > < / script >
2022-01-30 20:34:01 +00:00
< / body >
< / html >