[{"data":1,"prerenderedAt":550},["ShallowReactive",2],{"docs-otobo-znuny-paket-bauen-en":3},{"id":4,"title":5,"body":6,"category":541,"description":542,"draft":543,"extension":544,"meta":545,"navigation":409,"order":235,"path":546,"seo":547,"stem":548,"__hash__":549},"docsEn\u002Fdocs\u002Fotobo-znuny-paket-bauen.md","Building OTOBO & Znuny Packages (.opm)",{"type":7,"value":8,"toc":534},"minimark",[9,13,38,43,46,56,60,69,358,370,374,377,427,441,470,478,482,488,503,507,530],[10,11,5],"h1",{"id":12},"building-otobo-znuny-packages-opm",[14,15,16,17,21,22,29,30,33,34,37],"p",{},"An ",[18,19,20],"code",{},".opm"," package is an XML container that bundles Perl code, configuration, database changes, and frontend files. It is built from a ",[23,24,25,28],"strong",{},[18,26,27],{},".sopm"," source manifest"," along with the corresponding files. OTOBO, Znuny, and OTRS Community Edition use the same format. The primary difference is the root element (",[18,31,32],{},"otobo_package"," vs. ",[18,35,36],{},"otrs_package",").",[39,40,42],"h2",{"id":41},"_1-creating-the-directory-structure","1. Creating the Directory Structure",[14,44,45],{},"Create your files in the paths where they should reside on the target system:",[47,48,54],"pre",{"className":49,"code":51,"language":52,"meta":53},[50],"language-text","MyPackage\u002F\n├── MyPackage.sopm\n├── Kernel\u002F\n│   └── Config\u002F\n│       └── Files\u002F\n│           └── XML\u002F\n│               └── MyPackage.xml\n└── var\u002F\n    └── httpd\u002F\n        └── htdocs\u002F\n            └── js\u002F\n                └── MyPackage.js\n","text","",[18,55,51],{"__ignoreMap":53},[39,57,59],{"id":58},"_2-creating-the-sopm-manifest","2. Creating the .sopm Manifest",[14,61,62,63,68],{},"The manifest declares metadata, compatible frameworks, and the complete file list. Use the ",[64,65,67],"a",{"href":66},"\u002Ftools\u002Fsopm-generator",".sopm Generator"," to generate a valid manifest via a form:",[47,70,74],{"className":71,"code":72,"language":73,"meta":53,"style":53},"language-xml shiki shiki-themes one-dark-pro","\u003C?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\u003Cotobo_package version=\"1.1\">\n    \u003CName>MyPackage\u003C\u002FName>\n    \u003CVersion>1.0.0\u003C\u002FVersion>\n    \u003CFramework>11.0.x\u003C\u002FFramework>\n    \u003CFramework>7.0.x\u003C\u002FFramework>\n    \u003CVendor>Example GmbH\u003C\u002FVendor>\n    \u003CURL>https:\u002F\u002Fexample.com\u002F\u003C\u002FURL>\n    \u003CLicense>GPL-3.0\u003C\u002FLicense>\n    \u003CDescription Lang=\"en\">A short description.\u003C\u002FDescription>\n    \u003CDescription Lang=\"de\">Eine kurze Beschreibung.\u003C\u002FDescription>\n    \u003CFilelist>\n        \u003CFile Permission=\"660\" Location=\"Kernel\u002FConfig\u002FFiles\u002FXML\u002FMyPackage.xml\" \u002F>\n        \u003CFile Permission=\"644\" Location=\"var\u002Fhttpd\u002Fhtdocs\u002Fjs\u002FMyPackage.js\" \u002F>\n    \u003C\u002FFilelist>\n\u003C\u002Fotobo_package>\n","xml",[18,75,76,110,128,144,159,174,188,203,218,233,256,277,287,315,338,348],{"__ignoreMap":53},[77,78,81,85,88,92,95,99,102,104,107],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"sn6KH","\u003C?",[77,86,73],{"class":87},"sVyAn",[77,89,91],{"class":90},"sVC51"," version",[77,93,94],{"class":83},"=",[77,96,98],{"class":97},"subq3","\"1.0\"",[77,100,101],{"class":90}," encoding",[77,103,94],{"class":83},[77,105,106],{"class":97},"\"utf-8\"",[77,108,109],{"class":83}," ?>\n",[77,111,113,116,118,120,122,125],{"class":79,"line":112},2,[77,114,115],{"class":83},"\u003C",[77,117,32],{"class":87},[77,119,91],{"class":90},[77,121,94],{"class":83},[77,123,124],{"class":97},"\"1.1\"",[77,126,127],{"class":83},">\n",[77,129,131,134,137,140,142],{"class":79,"line":130},3,[77,132,133],{"class":83},"    \u003C",[77,135,136],{"class":87},"Name",[77,138,139],{"class":83},">MyPackage\u003C\u002F",[77,141,136],{"class":87},[77,143,127],{"class":83},[77,145,147,149,152,155,157],{"class":79,"line":146},4,[77,148,133],{"class":83},[77,150,151],{"class":87},"Version",[77,153,154],{"class":83},">1.0.0\u003C\u002F",[77,156,151],{"class":87},[77,158,127],{"class":83},[77,160,162,164,167,170,172],{"class":79,"line":161},5,[77,163,133],{"class":83},[77,165,166],{"class":87},"Framework",[77,168,169],{"class":83},">11.0.x\u003C\u002F",[77,171,166],{"class":87},[77,173,127],{"class":83},[77,175,177,179,181,184,186],{"class":79,"line":176},6,[77,178,133],{"class":83},[77,180,166],{"class":87},[77,182,183],{"class":83},">7.0.x\u003C\u002F",[77,185,166],{"class":87},[77,187,127],{"class":83},[77,189,191,193,196,199,201],{"class":79,"line":190},7,[77,192,133],{"class":83},[77,194,195],{"class":87},"Vendor",[77,197,198],{"class":83},">Example GmbH\u003C\u002F",[77,200,195],{"class":87},[77,202,127],{"class":83},[77,204,206,208,211,214,216],{"class":79,"line":205},8,[77,207,133],{"class":83},[77,209,210],{"class":87},"URL",[77,212,213],{"class":83},">https:\u002F\u002Fexample.com\u002F\u003C\u002F",[77,215,210],{"class":87},[77,217,127],{"class":83},[77,219,221,223,226,229,231],{"class":79,"line":220},9,[77,222,133],{"class":83},[77,224,225],{"class":87},"License",[77,227,228],{"class":83},">GPL-3.0\u003C\u002F",[77,230,225],{"class":87},[77,232,127],{"class":83},[77,234,236,238,241,244,246,249,252,254],{"class":79,"line":235},10,[77,237,133],{"class":83},[77,239,240],{"class":87},"Description",[77,242,243],{"class":90}," Lang",[77,245,94],{"class":83},[77,247,248],{"class":97},"\"en\"",[77,250,251],{"class":83},">A short description.\u003C\u002F",[77,253,240],{"class":87},[77,255,127],{"class":83},[77,257,259,261,263,265,267,270,273,275],{"class":79,"line":258},11,[77,260,133],{"class":83},[77,262,240],{"class":87},[77,264,243],{"class":90},[77,266,94],{"class":83},[77,268,269],{"class":97},"\"de\"",[77,271,272],{"class":83},">Eine kurze Beschreibung.\u003C\u002F",[77,274,240],{"class":87},[77,276,127],{"class":83},[77,278,280,282,285],{"class":79,"line":279},12,[77,281,133],{"class":83},[77,283,284],{"class":87},"Filelist",[77,286,127],{"class":83},[77,288,290,293,296,299,301,304,307,309,312],{"class":79,"line":289},13,[77,291,292],{"class":83},"        \u003C",[77,294,295],{"class":87},"File",[77,297,298],{"class":90}," Permission",[77,300,94],{"class":83},[77,302,303],{"class":97},"\"660\"",[77,305,306],{"class":90}," Location",[77,308,94],{"class":83},[77,310,311],{"class":97},"\"Kernel\u002FConfig\u002FFiles\u002FXML\u002FMyPackage.xml\"",[77,313,314],{"class":83}," \u002F>\n",[77,316,318,320,322,324,326,329,331,333,336],{"class":79,"line":317},14,[77,319,292],{"class":83},[77,321,295],{"class":87},[77,323,298],{"class":90},[77,325,94],{"class":83},[77,327,328],{"class":97},"\"644\"",[77,330,306],{"class":90},[77,332,94],{"class":83},[77,334,335],{"class":97},"\"var\u002Fhttpd\u002Fhtdocs\u002Fjs\u002FMyPackage.js\"",[77,337,314],{"class":83},[77,339,341,344,346],{"class":79,"line":340},15,[77,342,343],{"class":83},"    \u003C\u002F",[77,345,284],{"class":87},[77,347,127],{"class":83},[77,349,351,354,356],{"class":79,"line":350},16,[77,352,353],{"class":83},"\u003C\u002F",[77,355,32],{"class":87},[77,357,127],{"class":83},[14,359,360,361,364,365,369],{},"Every file on disk must be listed in the ",[18,362,363],{},"\u003CFilelist>"," and vice versa. The ",[64,366,368],{"href":367},"\u002Ftools\u002Fsopm-validator",".sopm Validator"," checks the most important rules directly in your browser.",[39,371,373],{"id":372},"_3-building-the-package","3. Building the Package",[14,375,376],{},"With a running OTOBO\u002FZnuny installation:",[47,378,382],{"className":379,"code":380,"language":381,"meta":53,"style":53},"language-bash shiki shiki-themes one-dark-pro","# OTOBO\nbin\u002Fotobo.Console.pl Dev::Package::Build \u002Fpath\u002Fto\u002FMyPackage.sopm \u002Ftarget\u002Fdirectory\u002F\n\n# Znuny \u002F OTRS\nbin\u002Fotrs.Console.pl Dev::Package::Build \u002Fpath\u002Fto\u002FMyPackage.sopm \u002Ftarget\u002Fdirectory\u002F\n","bash",[18,383,384,390,405,411,416],{"__ignoreMap":53},[77,385,386],{"class":79,"line":80},[77,387,389],{"class":388},"sV9Aq","# OTOBO\n",[77,391,392,396,399,402],{"class":79,"line":112},[77,393,395],{"class":394},"sVbv2","bin\u002Fotobo.Console.pl",[77,397,398],{"class":97}," Dev::Package::Build",[77,400,401],{"class":97}," \u002Fpath\u002Fto\u002FMyPackage.sopm",[77,403,404],{"class":97}," \u002Ftarget\u002Fdirectory\u002F\n",[77,406,407],{"class":79,"line":130},[77,408,410],{"emptyLinePlaceholder":409},true,"\n",[77,412,413],{"class":79,"line":146},[77,414,415],{"class":388},"# Znuny \u002F OTRS\n",[77,417,418,421,423,425],{"class":79,"line":161},[77,419,420],{"class":394},"bin\u002Fotrs.Console.pl",[77,422,398],{"class":97},[77,424,401],{"class":97},[77,426,404],{"class":97},[14,428,429,432,433,436,437,440],{},[23,430,431],{},"Without"," an installed ticketing system (e.g., in CI\u002FCD), use ",[18,434,435],{},"opmbuild"," from the ",[18,438,439],{},"OPM::Maker"," CPAN module:",[47,442,444],{"className":379,"code":443,"language":381,"meta":53,"style":53},"cpanm OPM::Maker\nopmbuild build --output \u002Ftarget\u002Fdirectory\u002F \u002Fpath\u002Fto\u002FMyPackage.sopm\n",[18,445,446,454],{"__ignoreMap":53},[77,447,448,451],{"class":79,"line":80},[77,449,450],{"class":394},"cpanm",[77,452,453],{"class":97}," OPM::Maker\n",[77,455,456,458,461,464,467],{"class":79,"line":112},[77,457,435],{"class":394},[77,459,460],{"class":97}," build",[77,462,463],{"class":90}," --output",[77,465,466],{"class":97}," \u002Ftarget\u002Fdirectory\u002F",[77,468,469],{"class":97}," \u002Fpath\u002Fto\u002FMyPackage.sopm\n",[14,471,472,473,477],{},"Find details in the ",[64,474,476],{"href":475},"\u002Fdocs\u002Fci-cd-opmbuild","CI\u002FCD Guide",".",[39,479,481],{"id":480},"_4-installing-testing","4. Installing & Testing",[14,483,484,485,487],{},"Install the generated ",[18,486,20],{}," via the package manager (Admin → Package Manager → Install Package) or via the console:",[47,489,491],{"className":379,"code":490,"language":381,"meta":53,"style":53},"bin\u002Fotobo.Console.pl Admin::Package::Install \u002Ftarget\u002Fdirectory\u002FMyPackage-1.0.0.opm\n",[18,492,493],{"__ignoreMap":53},[77,494,495,497,500],{"class":79,"line":80},[77,496,395],{"class":394},[77,498,499],{"class":97}," Admin::Package::Install",[77,501,502],{"class":97}," \u002Ftarget\u002Fdirectory\u002FMyPackage-1.0.0.opm\n",[39,504,506],{"id":505},"next-steps","Next Steps",[508,509,510,518,524],"ul",{},[511,512,513,517],"li",{},[64,514,516],{"href":515},"\u002Fdocs\u002Fsopm-referenz",".sopm Reference"," — all elements in detail",[511,519,520],{},[64,521,523],{"href":522},"\u002Fdocs\u002Fotobo-znuny-kompatibilitaet","Does my package run on OTOBO and Znuny?",[511,525,526],{},[64,527,529],{"href":528},"\u002Fdocs\u002Fpaket-veroeffentlichen","Publishing a Package on Open ITSM Hub",[531,532,533],"style",{},"html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}",{"title":53,"searchDepth":112,"depth":112,"links":535},[536,537,538,539,540],{"id":41,"depth":112,"text":42},{"id":58,"depth":112,"text":59},{"id":372,"depth":112,"text":373},{"id":480,"depth":112,"text":481},{"id":505,"depth":112,"text":506},"Packages","Step-by-step: From directory structure to the .sopm manifest and the final .opm file for OTOBO, Znuny, and OTRS CE.",false,"md",{},"\u002Fdocs\u002Fotobo-znuny-paket-bauen",{"title":5,"description":542},"docs\u002Fotobo-znuny-paket-bauen","9j9dKQ66PVHpwOIck-Mhkv17LVG7trJBEK12eP1H5k8",1787733084075]