[{"data":1,"prerenderedAt":320},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fmain\u002Fcontribute\u002Fdevelopment-setup":3},{"id":4,"title":5,"body":6,"description":307,"extension":308,"group":309,"meta":310,"navigation":311,"order":312,"path":313,"section":314,"seo":315,"source":316,"stem":317,"version":318,"__hash__":319},"docs\u002Fdocs\u002Fmain\u002Fcontribute\u002Fdevelopment-setup.md","Framework development setup",{"type":7,"value":8,"toc":299},"minimark",[9,14,31,97,105,109,134,137,141,156,159,172,179,183,186,215,226,230,233,269,277,281,295],[10,11,13],"h2",{"id":12},"fork-and-clone","Fork and clone",[15,16,17,18,25,26,30],"p",{},"Install Go 1.27.2 and Git. Fork ",[19,20,24],"a",{"href":21,"rel":22},"https:\u002F\u002Fgithub.com\u002Famkargar\u002Fgonex",[23],"nofollow","amkargar\u002Fgonex"," in GitHub, then clone your fork (replace ",[27,28,29],"code",{},"YOUR-USER"," with your username):",[32,33,38],"pre",{"className":34,"code":35,"language":36,"meta":37,"style":37},"language-sh shiki shiki-themes light-plus light-plus dark-plus","git clone https:\u002F\u002Fgithub.com\u002FYOUR-USER\u002Fgonex.git\ncd gonex\ngit remote add upstream https:\u002F\u002Fgithub.com\u002Famkargar\u002Fgonex.git\ngit switch -c fix\u002Fdescribe-the-change\n","sh","",[27,39,40,56,65,82],{"__ignoreMap":37},[41,42,45,49,53],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"swoLU","git",[41,50,52],{"class":51},"sFD8J"," clone",[41,54,55],{"class":51}," https:\u002F\u002Fgithub.com\u002FYOUR-USER\u002Fgonex.git\n",[41,57,59,62],{"class":43,"line":58},2,[41,60,61],{"class":47},"cd",[41,63,64],{"class":51}," gonex\n",[41,66,68,70,73,76,79],{"class":43,"line":67},3,[41,69,48],{"class":47},[41,71,72],{"class":51}," remote",[41,74,75],{"class":51}," add",[41,77,78],{"class":51}," upstream",[41,80,81],{"class":51}," https:\u002F\u002Fgithub.com\u002Famkargar\u002Fgonex.git\n",[41,83,85,87,90,94],{"class":43,"line":84},4,[41,86,48],{"class":47},[41,88,89],{"class":51}," switch",[41,91,93],{"class":92},"stxUP"," -c",[41,95,96],{"class":51}," fix\u002Fdescribe-the-change\n",[15,98,99,100,104],{},"If you are an upstream maintainer, use the upstream clone and your normal branch workflow. The commands in this contributor section run from the ",[101,102,103],"strong",{},"framework repository root",", unlike the application guide.",[10,106,108],{"id":107},"resolve-dependencies","Resolve dependencies",[32,110,112],{"className":34,"code":111,"language":36,"meta":37,"style":37},"go mod download\ngo mod verify\n",[27,113,114,125],{"__ignoreMap":37},[41,115,116,119,122],{"class":43,"line":44},[41,117,118],{"class":47},"go",[41,120,121],{"class":51}," mod",[41,123,124],{"class":51}," download\n",[41,126,127,129,131],{"class":43,"line":58},[41,128,118],{"class":47},[41,130,121],{"class":51},[41,132,133],{"class":51}," verify\n",[15,135,136],{},"The repository contains several independent Go modules. Resolving the root module alone does not verify the contracts\u002Fintegration\u002Fmicroservice modules.",[10,138,140],{"id":139},"run-the-source-example","Run the source example",[32,142,144],{"className":34,"code":143,"language":36,"meta":37,"style":37},"go run .\u002Fexamples\u002Fbasic\n",[27,145,146],{"__ignoreMap":37},[41,147,148,150,153],{"class":43,"line":44},[41,149,118],{"class":47},[41,151,152],{"class":51}," run",[41,154,155],{"class":51}," .\u002Fexamples\u002Fbasic\n",[15,157,158],{},"In another terminal:",[32,160,162],{"className":34,"code":161,"language":36,"meta":37,"style":37},"curl http:\u002F\u002F127.0.0.1:8080\u002Fusers\u002F1\n",[27,163,164],{"__ignoreMap":37},[41,165,166,169],{"class":43,"line":44},[41,167,168],{"class":47},"curl",[41,170,171],{"class":51}," http:\u002F\u002F127.0.0.1:8080\u002Fusers\u002F1\n",[15,173,174,175,178],{},"The example's memory-backed response is ",[27,176,177],{},"{\"id\":\"1\",\"name\":\"Ada\",\"email\":\"ada@example.com\"}",". Its health, readiness and OpenAPI routes let you inspect lifecycle and typed-contract behavior. This is a framework-development smoke example, not the default setup for a consumer application.",[10,180,182],{"id":181},"build-the-cli-you-are-changing","Build the CLI you are changing",[15,184,185],{},"On macOS\u002FLinux:",[32,187,189],{"className":34,"code":188,"language":36,"meta":37,"style":37},"go build -o gonex .\u002Fcmd\u002Fgonex\n.\u002Fgonex --help\n",[27,190,191,207],{"__ignoreMap":37},[41,192,193,195,198,201,204],{"class":43,"line":44},[41,194,118],{"class":47},[41,196,197],{"class":51}," build",[41,199,200],{"class":92}," -o",[41,202,203],{"class":51}," gonex",[41,205,206],{"class":51}," .\u002Fcmd\u002Fgonex\n",[41,208,209,212],{"class":43,"line":58},[41,210,211],{"class":47},".\u002Fgonex",[41,213,214],{"class":92}," --help\n",[15,216,217,218,221,222,225],{},"On Windows, build ",[27,219,220],{},"gonex.exe"," and invoke it with ",[27,223,224],{},".\\gonex.exe --help",". A global previously installed CLI will not automatically use your local changes; run the freshly built executable deliberately.",[10,227,229],{"id":228},"exercise-changes-from-a-separate-app","Exercise changes from a separate app",[15,231,232],{},"Keep a consumer app outside the framework checkout. From the consumer app, use an explicit absolute-path replacement:",[32,234,236],{"className":34,"code":235,"language":36,"meta":37,"style":37},"go mod edit -replace=github.com\u002Famkargar\u002Fgonex=\u002Fabsolute\u002Fpath\u002Fto\u002Fyour\u002Fgonex\ngo mod tidy\ngo test .\u002F...\n",[27,237,238,250,259],{"__ignoreMap":37},[41,239,240,242,244,247],{"class":43,"line":44},[41,241,118],{"class":47},[41,243,121],{"class":51},[41,245,246],{"class":51}," edit",[41,248,249],{"class":92}," -replace=github.com\u002Famkargar\u002Fgonex=\u002Fabsolute\u002Fpath\u002Fto\u002Fyour\u002Fgonex\n",[41,251,252,254,256],{"class":43,"line":58},[41,253,118],{"class":47},[41,255,121],{"class":51},[41,257,258],{"class":51}," tidy\n",[41,260,261,263,266],{"class":43,"line":67},[41,262,118],{"class":47},[41,264,265],{"class":51}," test",[41,267,268],{"class":51}," .\u002F...\n",[15,270,271,272,276],{},"This helps reproduce behavior through public imports. Remove the replacement and resolve a real dependency before deploying that app. See ",[19,273,275],{"href":274},"\u002Fdocs\u002Fmain\u002Fcontribute\u002Ftesting\u002F","testing and verification"," for the framework's own checks.",[10,278,280],{"id":279},"validate-microservice-developer-tooling","Validate microservice developer tooling",[15,282,283,284,288,289,294],{},"The ",[19,285,287],{"href":286},"\u002Fdocs\u002Fmain\u002Fmicroservices-quickstart\u002F","public application tutorial"," is the consumer path. Maintainer tests additionally exercise catalog safety, real child-process trees and an immutable contracts publication fixture on Linux\u002FWindows. See the upstream ",[19,290,293],{"href":291,"rel":292},"https:\u002F\u002Fgithub.com\u002Famkargar\u002Fgonex\u002Fblob\u002Fmain\u002Fdocs\u002Fmicroservices-dx\u002Facceptance.md",[23],"DX acceptance report"," for exact evidence and unverified independent onboarding.",[296,297,298],"style",{},"html pre.shiki code .swoLU, html code.shiki .swoLU{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#DCDCAA}html pre.shiki code .sFD8J, html code.shiki .sFD8J{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#CE9178}html pre.shiki code .stxUP, html code.shiki .stxUP{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#569CD6}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":37,"searchDepth":58,"depth":58,"links":300},[301,302,303,304,305,306],{"id":12,"depth":58,"text":13},{"id":107,"depth":58,"text":108},{"id":139,"depth":58,"text":140},{"id":181,"depth":58,"text":182},{"id":228,"depth":58,"text":229},{"id":279,"depth":58,"text":280},"Fork and clone Gonex, install its Go toolchain, run the source example and test local framework changes from another app.","md","START CONTRIBUTING",{},true,10,"\u002Fdocs\u002Fmain\u002Fcontribute\u002Fdevelopment-setup","contribute",{"title":5,"description":307},null,"docs\u002Fmain\u002Fcontribute\u002Fdevelopment-setup","main","pCx-orWq1mN0_Don85NiNcccKxnjpFffT3nT1VVfxsQ",1792521640763]