{"id":38615,"date":"2026-02-04T04:41:07","date_gmt":"2026-02-04T01:41:07","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38615"},"modified":"2026-02-04T04:41:07","modified_gmt":"2026-02-04T01:41:07","slug":"go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/","title":{"rendered":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme"},"content":{"rendered":"<p><body><\/p>\n<h2>Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, bir uygulaman\u0131n hangi s\u00fcr\u00fcm\u00fcn\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmek, hata ay\u0131klama, destek sa\u011flama, da\u011f\u0131t\u0131m ve genel sistem y\u00f6netimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. Go (Golang) uygulamalar\u0131, genellikle tek bir statik ikili dosya olarak derlendi\u011fi i\u00e7in, bu ikili dosyan\u0131n i\u00e7ine g\u00f6m\u00fcl\u00fc s\u00fcr\u00fcm bilgileri, uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca izlenebilirli\u011fini art\u0131r\u0131r. Bu teknik makale, Go uygulamalar\u0131nda s\u00fcr\u00fcm, derleme zaman\u0131, Git commit hash&#8217;i gibi meta verileri, Go derleyicisinin sundu\u011fu g\u00fc\u00e7l\u00fc bir \u00f6zellik olan <code>ldflags<\/code> (linker flags) kullanarak nas\u0131l y\u00f6netece\u011fimizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele alacakt\u0131r. <code>ldflags<\/code>&#8216;\u0131n temel prensiplerinden ba\u015flayarak, geli\u015fmi\u015f kullan\u0131m senaryolar\u0131na, otomasyon tekniklerine ve CI\/CD entegrasyonlar\u0131na kadar geni\u015f bir yelpazede bilgi sunaca\u011f\u0131z. Amac\u0131m\u0131z, geli\u015ftiricilere Go uygulamalar\u0131n\u0131 daha profesyonel ve y\u00f6netilebilir hale getirme konusunda kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h3>ldflags Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p><code>ldflags<\/code>, Go derleme s\u00fcrecinde ba\u011flay\u0131c\u0131ya (linker) iletilen \u00f6zel bayraklard\u0131r. Ba\u011flay\u0131c\u0131, derlenmi\u015f nesne dosyalar\u0131n\u0131 al\u0131p \u00e7al\u0131\u015ft\u0131r\u0131labilir bir ikili dosya olu\u015fturmaktan sorumlu olan bir programd\u0131r. <code>ldflags<\/code> arac\u0131l\u0131\u011f\u0131yla, bu ba\u011flay\u0131c\u0131ya, derleme zaman\u0131nda program\u0131n davran\u0131\u015f\u0131n\u0131 veya i\u00e7erdi\u011fi statik verileri de\u011fi\u015ftirecek talimatlar verebiliriz. En yayg\u0131n kullan\u0131mlar\u0131ndan biri, derleme s\u0131ras\u0131nda belirli de\u011fi\u015fkenlerin de\u011ferlerini de\u011fi\u015ftirmektir.<\/p>\n<p>Go&#8217;da bir uygulama derlendi\u011finde, derleyici kaynak kodunuzu makine koduna \u00e7evirir ve ard\u0131ndan ba\u011flay\u0131c\u0131 bu kod par\u00e7alar\u0131n\u0131, kullan\u0131lan k\u00fct\u00fcphanelerle (Go standart k\u00fct\u00fcphanesi dahil) birle\u015ftirerek nihai \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyay\u0131 olu\u015fturur. <code>ldflags<\/code>, bu son a\u015famada devreye girer. \u00d6zellikle <code>-X<\/code> bayra\u011f\u0131, Go derleyicisinin <code>go build<\/code> komutuyla birlikte kullan\u0131ld\u0131\u011f\u0131nda, belirli bir paketteki bir string de\u011fi\u015fkeninin de\u011ferini derleme an\u0131nda de\u011fi\u015ftirmemize olanak tan\u0131r.<\/p>\n<p>Bu \u00f6zellik, uygulaman\u0131n i\u00e7ine dinamik olarak de\u011fi\u015fen bilgiler (\u00f6rne\u011fin, s\u00fcr\u00fcm numaras\u0131, son commit hash&#8217;i, derleme tarihi) yerle\u015ftirmek i\u00e7in son derece \u00f6nemlidir. Bu bilgiler, uygulaman\u0131n kendisi taraf\u0131ndan \u00e7al\u0131\u015fma zaman\u0131nda sorgulanabilir hale gelir ve a\u015fa\u011f\u0131daki faydalar\u0131 sa\u011flar:<\/p>\n<p>*   <strong>\u0130zlenebilirlik:<\/strong> Hangi s\u00fcr\u00fcm\u00fcn hangi sunucuda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 veya hangi m\u00fc\u015fterinin hangi ikili dosyay\u0131 kulland\u0131\u011f\u0131n\u0131 kolayca tespit etme.<br \/>\n*   <strong>Hata Ay\u0131klama:<\/strong> Bir hata raporu geldi\u011finde, hatan\u0131n hangi kod taban\u0131nda (commit) meydana geldi\u011fini h\u0131zl\u0131ca belirleme.<br \/>\n*   <strong>Destek:<\/strong> Kullan\u0131c\u0131lardan gelen sorulara &#8220;Hangi s\u00fcr\u00fcm\u00fc kullan\u0131yorsunuz?&#8221; sorusunun cevab\u0131n\u0131 uygulama i\u00e7inden alabilme.<br \/>\n*   <strong>Da\u011f\u0131t\u0131m Y\u00f6netimi:<\/strong> Farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in farkl\u0131 derleme bilgileri ekleyebilme.<br \/>\n*   <strong>G\u00fcvenlik ve Uyumluluk:<\/strong> G\u00fcvenlik yamalar\u0131n\u0131n veya uyumluluk g\u00fcncellemelerinin hangi s\u00fcr\u00fcmden itibaren ge\u00e7erli oldu\u011funu belirleme.<\/p>\n<p><code>ldflags<\/code> kullanarak eklenen bilgiler, derlenmi\u015f ikili dosyan\u0131n ayr\u0131lmaz bir par\u00e7as\u0131 haline gelir. Bu, uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in harici bir yap\u0131land\u0131rma dosyas\u0131na veya ortam de\u011fi\u015fkenine ihtiya\u00e7 duymadan kendi meta verilerini ta\u015f\u0131d\u0131\u011f\u0131 anlam\u0131na gelir. Bu statik ba\u011flama, Go&#8217;nun &#8220;tek ikili dosya&#8221; felsefesiyle m\u00fckemmel bir \u015fekilde uyum sa\u011flar.<\/p>\n<h3>Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgisi Neden Gereklidir?<\/h3>\n<p>Bir Go uygulamas\u0131n\u0131n s\u00fcr\u00fcm bilgisini ta\u015f\u0131mas\u0131, sadece &#8220;iyi bir uygulama&#8221; olmakla kalmaz, ayn\u0131 zamanda operasyonel verimlilik ve s\u00fcrd\u00fcr\u00fclebilirlik a\u00e7\u0131s\u0131ndan temel bir gerekliliktir. \u0130\u015fte nedenleri:<\/p>\n<p>1.  <strong>Hata Ay\u0131klama ve Hata Raporlama:<\/strong> Bir uygulama beklenmedik bir \u015fekilde davrand\u0131\u011f\u0131nda veya \u00e7\u00f6kt\u00fc\u011f\u00fcnde, ilk sorulardan biri genellikle &#8220;Hangi s\u00fcr\u00fcm\u00fc kullan\u0131yorsunuz?&#8221; olur. S\u00fcr\u00fcm bilgisi, hatan\u0131n belirli bir kod taban\u0131na veya da\u011f\u0131t\u0131ma \u00f6zg\u00fc olup olmad\u0131\u011f\u0131n\u0131 h\u0131zl\u0131ca belirlemeye yard\u0131mc\u0131 olur. Git commit hash&#8217;i gibi daha detayl\u0131 bilgiler, do\u011frudan sorunlu kod sat\u0131r\u0131na ula\u015fmay\u0131 sa\u011flayabilir.<br \/>\n2.  <strong>M\u00fc\u015fteri ve Kullan\u0131c\u0131 Deste\u011fi:<\/strong> M\u00fc\u015fterileriniz veya son kullan\u0131c\u0131lar\u0131n\u0131z bir sorunla kar\u015f\u0131la\u015ft\u0131\u011f\u0131nda, onlardan ald\u0131\u011f\u0131n\u0131z s\u00fcr\u00fcm bilgisi, do\u011fru dok\u00fcmantasyona, bilinen sorunlara veya \u00e7\u00f6z\u00fcm ad\u0131mlar\u0131na y\u00f6nlendirme konusunda size yard\u0131mc\u0131 olur.<br \/>\n3.  <strong>Da\u011f\u0131t\u0131m ve Ortam Y\u00f6netimi:<\/strong> Bir uygulaman\u0131n birden fazla ortamda (geli\u015ftirme, test, sahneleme, \u00fcretim) \u00e7al\u0131\u015fmas\u0131 yayg\u0131nd\u0131r. Her ortamda hangi s\u00fcr\u00fcm\u00fcn da\u011f\u0131t\u0131ld\u0131\u011f\u0131n\u0131 bilmek, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini y\u00f6netmek, ortamlar aras\u0131 tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak ve olas\u0131 \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek i\u00e7in hayati \u00f6nem ta\u015f\u0131r.<br \/>\n4.  <strong>Y\u00fckseltme ve Geri Alma Stratejileri:<\/strong> Yeni bir s\u00fcr\u00fcm da\u011f\u0131t\u0131ld\u0131\u011f\u0131nda ve sorunlar ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, \u00f6nceki kararl\u0131 s\u00fcr\u00fcme geri d\u00f6nme karar\u0131 al\u0131nabilir. Do\u011fru s\u00fcr\u00fcm bilgisi, hangi ikili dosyan\u0131n hangi s\u00fcr\u00fcm\u00fc temsil etti\u011fini netle\u015ftirerek bu s\u00fcreci kolayla\u015ft\u0131r\u0131r.<br \/>\n5.  <strong>Denetlenebilirlik ve Uyumluluk:<\/strong> Baz\u0131 end\u00fcstrilerde veya d\u00fczenlemelerde, yaz\u0131l\u0131m\u0131n belirli bir s\u00fcr\u00fcm\u00fcn\u00fcn ne zaman ve kim taraf\u0131ndan derlendi\u011fi, hangi kaynak koduna kar\u015f\u0131l\u0131k geldi\u011fi gibi bilgilerin denetlenebilir olmas\u0131 gerekebilir. <code>ldflags<\/code> ile eklenen bilgiler bu t\u00fcr gereksinimleri kar\u015f\u0131lamaya yard\u0131mc\u0131 olabilir.<br \/>\n6.  <strong>Dok\u00fcmantasyon ve S\u00fcr\u00fcm Notlar\u0131:<\/strong> Uygulama i\u00e7inde g\u00f6sterilen s\u00fcr\u00fcm bilgisi, kullan\u0131c\u0131lar\u0131n o s\u00fcr\u00fcmle ilgili s\u00fcr\u00fcm notlar\u0131na veya dok\u00fcmantasyona kolayca ula\u015fmas\u0131n\u0131 sa\u011flayabilir.<\/p>\n<p>Bu nedenlerle, Go uygulamalar\u0131n\u0131zda kapsaml\u0131 s\u00fcr\u00fcm bilgileri bulundurmak, geli\u015ftirme, da\u011f\u0131t\u0131m ve bak\u0131m s\u00fcre\u00e7lerinizi \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftiren bir yat\u0131r\u0131md\u0131r.<\/p>\n<h3>ldflags ile S\u00fcr\u00fcm Bilgisi Eklemenin Temelleri<\/h3>\n<p><code>ldflags<\/code> ile bir Go uygulamas\u0131na s\u00fcr\u00fcm bilgisi eklemek i\u00e7in, \u00f6ncelikle uygulaman\u0131zda bu bilgiyi tutacak bir de\u011fi\u015fken tan\u0131mlaman\u0131z gerekir. Bu de\u011fi\u015fkenin <strong>string t\u00fcr\u00fcnde<\/strong>, <code>var<\/code> ile tan\u0131mlanm\u0131\u015f (yani <code>const<\/code> olmamal\u0131) ve <code>main<\/code> paketinde (veya ba\u015fka bir pakette, ancak eri\u015filebilir bir \u015fekilde) olmas\u0131 \u00f6nemlidir. Go ba\u011flay\u0131c\u0131s\u0131, <code>const<\/code> olarak tan\u0131mlanm\u0131\u015f veya do\u011frudan derleyici taraf\u0131ndan sabitlenmi\u015f de\u011ferleri de\u011fi\u015ftiremez.<\/p>\n<h4>\u00d6rnek Go Kodu Yap\u0131s\u0131<\/h4>\n<p>A\u015fa\u011f\u0131da, s\u00fcr\u00fcm bilgilerini tutacak basit bir <code>main.go<\/code> dosyas\u0131 \u00f6rne\u011fi bulunmaktad\u0131r:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n)\n\n\/\/ Bu de\u011fi\u015fkenler ldflags ile derleme zaman\u0131nda de\u011fi\u015ftirilecektir.\nvar (\n\tversion   = \"dev\" \/\/ Uygulaman\u0131n s\u00fcr\u00fcm\u00fc\n\tcommit    = \"none\" \/\/ Git commit hash'i\n\tbuildDate = \"unknown\" \/\/ Derleme tarihi\n)\n\nfunc main() {\n\tfmt.Printf(\"Uygulama S\u00fcr\u00fcm\u00fc: %s\\n\", version)\n\tfmt.Printf(\"Git Commit: %s\\n\", commit)\n\tfmt.Printf(\"Derleme Tarihi: %s\\n\", buildDate)\n\tfmt.Printf(\"Go S\u00fcr\u00fcm\u00fc: %s\\n\", runtime.Version())\n\tfmt.Printf(\"\u0130\u015fletim Sistemi\/Mimari: %s\/%s\\n\", runtime.GOOS, runtime.GOARCH)\n}\n\nfunc GetVersionInfo() string {\n\treturn fmt.Sprintf(\"Version: %s, Commit: %s, Build Date: %s\", version, commit, buildDate)\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>version<\/code>, <code>commit<\/code> ve <code>buildDate<\/code> ad\u0131nda \u00fc\u00e7 adet global string de\u011fi\u015fkeni tan\u0131mlanm\u0131\u015ft\u0131r. Ba\u015flang\u0131\u00e7 de\u011ferleri varsay\u0131lan olarak <code>dev<\/code>, <code>none<\/code> ve <code>unknown<\/code> olarak ayarlanm\u0131\u015ft\u0131r. Bu varsay\u0131lan de\u011ferler, e\u011fer <code>ldflags<\/code> kullan\u0131lmazsa veya belirli bir de\u011fi\u015fken i\u00e7in <code>ldflags<\/code> belirtilmezse ge\u00e7erli olacakt\u0131r. <code>main<\/code> fonksiyonu bu bilgileri ekrana yazd\u0131r\u0131r ve <code>GetVersionInfo<\/code> fonksiyonu ise bu bilgilere programatik olarak eri\u015fimi sa\u011flar.<\/p>\n<h4>Basit Bir S\u00fcr\u00fcm Bilgisi Ekleme<\/h4>\n<p>\u015eimdi, bu de\u011fi\u015fkenlerden birinin de\u011ferini <code>ldflags<\/code> kullanarak nas\u0131l de\u011fi\u015ftirece\u011fimize bakal\u0131m. <code>go build<\/code> komutuna <code>-ldflags<\/code> bayra\u011f\u0131n\u0131 ekleyerek bu i\u015flemi ger\u00e7ekle\u015ftirebiliriz. <code>-ldflags<\/code>&#8216;\u0131n arg\u00fcman\u0131, ba\u011flay\u0131c\u0131ya iletilecek ek bayraklar\u0131 i\u00e7erir. Bu bayraklar\u0131n i\u00e7inde, Go&#8217;ya \u00f6zel olan <code>-X<\/code> bayra\u011f\u0131n\u0131 kullan\u0131r\u0131z.<\/p>\n<p><code>-X<\/code> bayra\u011f\u0131n\u0131n format\u0131 \u015f\u00f6yledir: <code>-X <paket_yolu>.<de\u011fi\u015fken_ad\u0131>=<yeni_de\u011fer><\/code>.<br \/>\n<code>main<\/code> paketindeki bir de\u011fi\u015fken i\u00e7in paket yolu <code>main<\/code>&#8216;dir.<\/p>\n<p>\u00d6rne\u011fin, <code>version<\/code> de\u011fi\u015fkenini <code>1.0.0<\/code> olarak ayarlamak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-bash\">go build -ldflags \"-X main.version=1.0.0\" -o myapp<\/code><\/pre>\n<p>Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, <code>myapp<\/code> ad\u0131nda bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya olu\u015fturulacakt\u0131r. Bu dosyay\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda \u00e7\u0131kt\u0131 \u015fu \u015fekilde olacakt\u0131r:<\/p>\n<pre><code class=\"language-\">Uygulama S\u00fcr\u00fcm\u00fc: 1.0.0\nGit Commit: none\nDerleme Tarihi: unknown\nGo S\u00fcr\u00fcm\u00fc: go1.22.1\n\u0130\u015fletim Sistemi\/Mimari: linux\/amd64<\/code><\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>version<\/code> de\u011fi\u015fkeninin de\u011feri <code>1.0.0<\/code> olarak g\u00fcncellenmi\u015f, ancak <code>commit<\/code> ve <code>buildDate<\/code> de\u011fi\u015fkenleri varsay\u0131lan de\u011ferlerini korumu\u015ftur, \u00e7\u00fcnk\u00fc onlar i\u00e7in herhangi bir <code>ldflags<\/code> belirtmedik.<\/p>\n<p>Birden fazla de\u011fi\u015fkeni ayn\u0131 anda g\u00fcncellemek i\u00e7in, <code>-X<\/code> bayra\u011f\u0131n\u0131 her bir de\u011fi\u015fken i\u00e7in ayr\u0131 ayr\u0131 kullanabiliriz:<\/p>\n<pre><code class=\"language-bash\">go build -ldflags \"-X main.version=1.0.0 -X main.commit=abcdef123456 -X main.buildDate=2023-10-27T10:00:00Z\" -o myapp<\/code><\/pre>\n<p>Bu komut, her \u00fc\u00e7 de\u011fi\u015fkeni de belirtilen de\u011ferlerle g\u00fcncelleyecektir. \u00c7\u0131kt\u0131 ise \u015f\u00f6yle olacakt\u0131r:<\/p>\n<pre><code class=\"language-\">Uygulama S\u00fcr\u00fcm\u00fc: 1.0.0\nGit Commit: abcdef123456\nDerleme Tarihi: 2023-10-27T10:00:00Z\nGo S\u00fcr\u00fcm\u00fc: go1.22.1\n\u0130\u015fletim Sistemi\/Mimari: linux\/amd64<\/code><\/pre>\n<p>Bu temel ad\u0131mlar, <code>ldflags<\/code> kullanarak Go uygulamalar\u0131na statik bilgi eklemenin kap\u0131s\u0131n\u0131 aralamaktad\u0131r. Bir sonraki b\u00f6l\u00fcmde, bu bilgileri daha dinamik ve otomatik hale getirmek i\u00e7in Git ve derleme zaman\u0131 bilgilerini nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<h3>Daha Geli\u015fmi\u015f S\u00fcr\u00fcm Bilgisi Y\u00f6netimi<\/h3>\n<p>Basit string de\u011ferleri eklemek yeterli olsa da, ger\u00e7ek d\u00fcnya senaryolar\u0131nda s\u00fcr\u00fcm bilgilerinin dinamik olarak olu\u015fturulmas\u0131 ve g\u00fcncel tutulmas\u0131 istenir. Bu, \u00f6zellikle s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) ortamlar\u0131nda b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<h4>Git Bilgilerini Kullanma (Commit Hash, Branch, Tag)<\/h4>\n<p>Bir uygulaman\u0131n derlendi\u011fi anda, kod taban\u0131n\u0131n hangi Git commit&#8217;ine kar\u015f\u0131l\u0131k geldi\u011fini bilmek, hata ay\u0131klama ve izlenebilirlik i\u00e7in paha bi\u00e7ilmezdir. Git, bu bilgileri almak i\u00e7in \u00e7e\u015fitli komutlar sunar.<\/p>\n<p>*   <strong>Commit Hash (SHA):<\/strong> Mevcut commit&#8217;in tam SHA-1 hash&#8217;ini almak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">git rev-parse HEAD<\/code><\/pre>\n<p>    K\u0131sa hash i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">git rev-parse --short HEAD<\/code><\/pre>\n<p>*   <strong>Branch Ad\u0131:<\/strong> Mevcut branch&#8217;in ad\u0131n\u0131 almak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">git rev-parse --abbrev-ref HEAD<\/code><\/pre>\n<p>*   <strong>En Son Tag:<\/strong> En yak\u0131n tag&#8217;i ve e\u011fer commit tag&#8217;den sonra yap\u0131lm\u0131\u015fsa, ka\u00e7 commit sonra yap\u0131ld\u0131\u011f\u0131n\u0131 ve k\u0131sa commit hash&#8217;ini almak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">git describe --tags --always --dirty<\/code><\/pre>\n<p>    <code>--dirty<\/code> bayra\u011f\u0131, \u00e7al\u0131\u015fma dizininde kaydedilmemi\u015f de\u011fi\u015fiklikler varsa bunu belirtir. Bu, geli\u015ftirme a\u015famas\u0131nda faydal\u0131d\u0131r.<\/p>\n<p>Bu komutlar\u0131 <code>ldflags<\/code> ile birle\u015ftirmek i\u00e7in shell komut ikamesini (command substitution) kullan\u0131r\u0131z. \u00d6rne\u011fin, Bash&#8217;te <code>$(komut)<\/code> veya `<code> <\/code>komut<code> <\/code><code> syntax'\u0131 kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-bash\"># Git commit hash ve branch bilgisini ekleme\nCOMMIT=$(git rev-parse --short HEAD)\nBRANCH=$(git rev-parse --abbrev-ref HEAD)\n\ngo build -ldflags \"-X main.commit=$COMMIT -X main.branch=$BRANCH\" -o myapp<\/code><\/pre>\n<p>Bu \u00f6rnekte, <\/code>COMMIT<code> ve <\/code>BRANCH<code> ad\u0131nda iki shell de\u011fi\u015fkeni tan\u0131mlan\u0131r ve bunlar\u0131n de\u011ferleri <\/code>ldflags<code> i\u00e7ine aktar\u0131l\u0131r. Go kodunuzda <\/code>branch<code> ad\u0131nda bir de\u011fi\u015fkenin de tan\u0131ml\u0131 oldu\u011funu varsayal\u0131m:<\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n)\n\nvar (\n\tversion   = \"dev\"\n\tcommit    = \"none\"\n\tbuildDate = \"unknown\"\n\tbranch    = \"main\" \/\/ Yeni eklenen de\u011fi\u015fken\n)\n\nfunc main() {\n\tfmt.Printf(\"Uygulama S\u00fcr\u00fcm\u00fc: %s\\n\", version)\n\tfmt.Printf(\"Git Commit: %s\\n\", commit)\n\tfmt.Printf(\"Git Branch: %s\\n\", branch) \/\/ \u00c7\u0131kt\u0131ya ekle\n\tfmt.Printf(\"Derleme Tarihi: %s\\n\", buildDate)\n\tfmt.Printf(\"Go S\u00fcr\u00fcm\u00fc: %s\\n\", runtime.Version())\n\tfmt.Printf(\"\u0130\u015fletim Sistemi\/Mimari: %s\/%s\\n\", runtime.GOOS, runtime.GOARCH)\n}<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma ile, uygulaman\u0131z derlendi\u011finde hangi Git commit'inden geldi\u011fini ve hangi branch'te derlendi\u011fini g\u00f6sterecektir.<\/p>\n<h4>Derleme Zaman\u0131n\u0131 Ekleme<\/h4>\n<p>Uygulaman\u0131n tam olarak ne zaman derlendi\u011fini bilmek, \u00f6zellikle birden fazla da\u011f\u0131t\u0131m yap\u0131ld\u0131\u011f\u0131nda veya belirli bir derlemenin ne kadar s\u00fcredir \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak i\u00e7in faydal\u0131d\u0131r. Derleme zaman\u0131n\u0131 almak i\u00e7in genellikle <\/code>date<code> komutu kullan\u0131l\u0131r. UTC (Coordinated Universal Time) format\u0131nda zaman damgas\u0131 kullanmak, zaman dilimi farkl\u0131l\u0131klar\u0131ndan kaynaklanan kar\u0131\u015f\u0131kl\u0131klar\u0131 \u00f6nlemek i\u00e7in iyi bir pratiktir.<\/p>\n<pre><code class=\"language-bash\"># UTC format\u0131nda derleme zaman\u0131n\u0131 ekleme\nBUILD_DATE=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\n\ngo build -ldflags \"-X main.buildDate=$BUILD_DATE\" -o myapp<\/code><\/pre>\n<p>Bu komut, <\/code>BUILD_DATE<code> de\u011fi\u015fkenine <\/code>2023-10-27T10:30:00Z<code> gibi bir de\u011fer atayacak ve bu de\u011feri <\/code>main.buildDate<code> Go de\u011fi\u015fkenine aktaracakt\u0131r.<\/p>\n<p>T\u00fcm bu bilgileri birle\u015ftirerek daha kapsaml\u0131 bir <\/code>go build<code> komutu olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-bash\">VERSION=\"1.0.0\"\nCOMMIT=$(git rev-parse --short HEAD)\nBRANCH=$(git rev-parse --abbrev-ref HEAD)\nBUILD_DATE=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\n\ngo build -ldflags \"-X main.version=$VERSION -X main.commit=$COMMIT -X main.branch=$BRANCH -X main.buildDate=$BUILD_DATE\" -o myapp<\/code><\/pre>\n<p>Bu komut, uygulaman\u0131z\u0131n i\u00e7ine s\u00fcr\u00fcm numaras\u0131, Git commit hash'i, branch ad\u0131 ve derleme tarihini dinamik olarak yerle\u015ftirecektir.<\/p>\n<h4>Dinamik De\u011fi\u015fken Adlar\u0131 ve Paketler Aras\u0131 Kullan\u0131m<\/h4>\n<p>Yukar\u0131daki \u00f6rneklerde <\/code>main<code> paketindeki de\u011fi\u015fkenleri kulland\u0131k. Ancak, s\u00fcr\u00fcm bilgilerini ayr\u0131 bir pakette tutmak ve bu paketteki de\u011fi\u015fkenleri <\/code>ldflags<code> ile de\u011fi\u015ftirmek de m\u00fcmk\u00fcnd\u00fcr. Bu, uygulaman\u0131z\u0131n mod\u00fclerli\u011fini art\u0131r\u0131r.<\/p>\n<p>\u00d6rne\u011fin, <\/code>pkg\/version\/version.go<code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-go\">\/\/ pkg\/version\/version.go\npackage version\n\nvar (\n\tVersion   = \"dev\"\n\tCommit    = \"none\"\n\tBuildDate = \"unknown\"\n)<\/code><\/pre>\n<p>Ve <\/code>main.go<code> dosyam\u0131zda bu paketi kullanal\u0131m:<\/p>\n<pre><code class=\"language-go\">\/\/ main.go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"your_module_path\/pkg\/version\" \/\/ Kendi mod\u00fcl yolunuzu buraya yaz\u0131n\n)\n\nfunc main() {\n\tfmt.Printf(\"Uygulama S\u00fcr\u00fcm\u00fc: %s\\n\", version.Version)\n\tfmt.Printf(\"Git Commit: %s\\n\", version.Commit)\n\tfmt.Printf(\"Derleme Tarihi: %s\\n\", version.BuildDate)\n\tfmt.Printf(\"Go S\u00fcr\u00fcm\u00fc: %s\\n\", runtime.Version())\n\tfmt.Printf(\"\u0130\u015fletim Sistemi\/Mimari: %s\/%s\\n\", runtime.GOOS, runtime.GOARCH)\n}<\/code><\/pre>\n<p>Bu durumda, <\/code>ldflags<code> komutunu kullan\u0131rken tam paket yolunu belirtmeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">MODULE_PATH=\"github.com\/your_username\/your_module_name\" # go.mod dosyan\u0131zdaki mod\u00fcl ad\u0131\nVERSION=\"1.0.0\"\nCOMMIT=$(git rev-parse --short HEAD)\nBUILD_DATE=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\n\ngo build -ldflags \"-X ${MODULE_PATH}\/pkg\/version.Version=$VERSION -X ${MODULE_PATH}\/pkg\/version.Commit=$COMMIT -X ${MODULE_PATH}\/pkg\/version.BuildDate=$BUILD_DATE\" -o myapp<\/code><\/pre>\n<p>Burada <\/code>${MODULE_PATH}<code> de\u011fi\u015fkeni, <\/code>go.mod<code> dosyan\u0131zda tan\u0131mlanan mod\u00fcl ad\u0131n\u0131z olmal\u0131d\u0131r. Bu yakla\u015f\u0131m, s\u00fcr\u00fcm bilgilerini uygulaman\u0131z\u0131n geri kalan\u0131ndan ay\u0131rarak daha temiz bir kod taban\u0131 sa\u011flar.<\/p>\n<h3>Otomasyon ve CI\/CD Entegrasyonu<\/h3>\n<p>Yukar\u0131daki komutlar\u0131 her seferinde manuel olarak \u00e7al\u0131\u015ft\u0131rmak verimsiz ve hataya a\u00e7\u0131kt\u0131r. Bu s\u00fcreci otomatikle\u015ftirmek, \u00f6zellikle CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) pipeline'lar\u0131nda vazge\u00e7ilmezdir.<\/p>\n<h4>Makefile Kullan\u0131m\u0131<\/h4>\n<p><\/code>Makefile<code>'lar, derleme ve proje y\u00f6netimi g\u00f6revlerini otomatikle\u015ftirmek i\u00e7in klasik ve etkili bir y\u00f6ntemdir. Bir <\/code>Makefile<code> kullanarak <\/code>ldflags<code> ile s\u00fcr\u00fcm bilgilerini otomatik olarak ekleyebiliriz.<\/p>\n<pre><code class=\"language-makefile\"># Makefile\n\n<h2>Uygulaman\u0131n ad\u0131<\/h2>\nAPP_NAME := myapp\n<h2>Go mod\u00fcl yolu (go.mod dosyan\u0131zdaki mod\u00fcl ad\u0131)<\/h2>\nMODULE_PATH := github.com\/your_username\/your_module_name\n\n<h2>S\u00fcr\u00fcm bilgileri i\u00e7in de\u011fi\u015fkenler<\/h2>\nVERSION ?= dev\nCOMMIT ?= $(shell git rev-parse --short HEAD 2>\/dev\/null || echo \"none\")\nBRANCH ?= $(shell git rev-parse --abbrev-ref HEAD 2>\/dev\/null || echo \"none\")\nBUILD_DATE ?= $(shell date -u +\"%Y-%m-%dT%H:%M:%SZ\")\n\n<h2>ldflags string'ini olu\u015fturma<\/h2>\nLDFLAGS := -X $(MODULE_PATH)\/pkg\/version.Version=$(VERSION) \\\n           -X $(MODULE_PATH)\/pkg\/version.Commit=$(COMMIT) \\\n           -X $(MODULE_PATH)\/pkg\/version.Branch=$(BRANCH) \\\n           -X $(MODULE_PATH)\/pkg\/version.BuildDate=$(BUILD_DATE)\n\n<h2>Varsay\u0131lan hedef: uygulamay\u0131 derle<\/h2>\nall: build\n\n<h2>Uygulamay\u0131 derleme hedefi<\/h2>\nbuild:\n\t@echo \"Derleniyor $(APP_NAME)...\"\n\tgo build -ldflags \"$(LDFLAGS)\" -o $(APP_NAME) .\/cmd\/myapp # Ana uygulaman\u0131z\u0131n yolu\n\t@echo \"$(APP_NAME) derlendi.\"\n\n<h2>S\u00fcr\u00fcm bilgilerini g\u00f6steren hedef<\/h2>\nversion:\n\t@echo \"Version: $(VERSION)\"\n\t@echo \"Commit: $(COMMIT)\"\n\t@echo \"Branch: $(BRANCH)\"\n\t@echo \"Build Date: $(BUILD_DATE)\"\n\n<h2>Temizleme hedefi<\/h2>\nclean:\n\t@echo \"Temizleniyor...\"\n\tgo clean\n\trm -f $(APP_NAME)\n\t@echo \"Temizlendi.\"\n\n.PHONY: all build version clean<\/code><\/pre>\n<p>Bu <\/code>Makefile<code>'da:<br \/>\n*   <\/code>?=<code> operat\u00f6r\u00fc, e\u011fer de\u011fi\u015fken d\u0131\u015far\u0131dan ayarlanmam\u0131\u015fsa (\u00f6rne\u011fin <\/code>make VERSION=1.1.0 build<code> gibi), varsay\u0131lan de\u011feri kullan\u0131r.<br \/>\n*   <\/code>$(shell &#8230;)<code> komut ikamesi, <\/code>Makefile<code>'\u0131n kabuk komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131na olanak tan\u0131r. <\/code>2>\/dev\/null || echo &#8220;none&#8221;<code> k\u0131sm\u0131, Git deposu olmayan bir ortamda hata vermeden <\/code>none<code> de\u011ferini kullanmay\u0131 sa\u011flar.<br \/>\n*   <\/code>LDFLAGS<code> de\u011fi\u015fkeni, t\u00fcm <\/code>-X<code> bayraklar\u0131n\u0131 bir araya getirir.<br \/>\n*   <\/code>build<code> hedefi, <\/code>go build<code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131r ve <\/code>LDFLAGS<code>'\u0131 kullan\u0131r.<br \/>\n*   <\/code>version<code> hedefi, derleme s\u0131ras\u0131nda kullan\u0131lacak s\u00fcr\u00fcm bilgilerini g\u00f6sterir.<br \/>\n*   <\/code>clean<code> hedefi, derlenmi\u015f ikili dosyay\u0131 ve Go'nun ge\u00e7ici dosyalar\u0131n\u0131 temizler.<\/p>\n<p>Bu <\/code>Makefile<code> ile, sadece <\/code>make build<code> komutunu \u00e7al\u0131\u015ft\u0131rarak uygulaman\u0131z\u0131 g\u00fcncel s\u00fcr\u00fcm bilgileriyle derleyebilirsiniz.<\/p>\n<h4>Shell Scriptleri ile Otomasyon<\/h4>\n<p>Daha basit projeler veya <\/code>Makefile<code> kullanmak istemeyenler i\u00e7in bir shell scripti de benzer otomasyonu sa\u011flayabilir.<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n\n<h2>build.sh<\/h2>\n\nAPP_NAME=\"myapp\"\nMODULE_PATH=\"github.com\/your_username\/your_module_name\" # go.mod dosyan\u0131zdaki mod\u00fcl ad\u0131\nMAIN_PACKAGE=\".\/cmd\/myapp\" # Ana uygulaman\u0131z\u0131n Go paketi yolu\n\n<h2>S\u00fcr\u00fcm bilgileri<\/h2>\nVERSION=${APP_VERSION:-\"dev\"} # Ortam de\u011fi\u015fkeninden al veya varsay\u0131lan \"dev\" kullan\nCOMMIT=$(git rev-parse --short HEAD 2>\/dev\/null || echo \"none\")\nBRANCH=$(git rev-parse --abbrev-ref HEAD 2>\/dev\/null || echo \"none\")\nBUILD_DATE=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\n\necho \"Derleniyor $APP_NAME...\"\necho \"Version: $VERSION\"\necho \"Commit: $COMMIT\"\necho \"Branch: $BRANCH\"\necho \"Build Date: $BUILD_DATE\"\n\n<h2>ldflags string'ini olu\u015fturma<\/h2>\nLDFLAGS=\"-X ${MODULE_PATH}\/pkg\/version.Version=${VERSION} \\\n         -X ${MODULE_PATH}\/pkg\/version.Commit=${COMMIT} \\\n         -X ${MODULE_PATH}\/pkg\/version.Branch=${BRANCH} \\\n         -X ${MODULE_PATH}\/pkg\/version.BuildDate=${BUILD_DATE}\"\n\n<h2>Go uygulamas\u0131n\u0131 derle<\/h2>\ngo build -ldflags \"${LDFLAGS}\" -o ${APP_NAME} ${MAIN_PACKAGE}\n\nif [ $? -eq 0 ]; then\n    echo \"$APP_NAME ba\u015far\u0131yla derlendi.\"\nelse\n    echo \"Hata: $APP_NAME derlenemedi.\"\n    exit 1\nfi<\/code><\/pre>\n<p>Bu scripti <\/code>build.sh<code> olarak kaydedip <\/code>chmod +x build.sh<code> ile \u00e7al\u0131\u015ft\u0131r\u0131labilir hale getirdikten sonra <\/code>.\/build.sh<code> komutuyla derleme i\u015flemini otomatikle\u015ftirebilirsiniz. <\/code>APP_VERSION<code> gibi ortam de\u011fi\u015fkenlerini kullanarak s\u00fcr\u00fcm numaras\u0131n\u0131 d\u0131\u015far\u0131dan da kontrol edebilirsiniz (<\/code>APP_VERSION=1.2.0 .\/build.sh<code>).<\/p>\n<h4>CI\/CD Ortamlar\u0131nda Kullan\u0131m (GitHub Actions, GitLab CI, Jenkins)<\/h4>\n<p>CI\/CD pipeline'lar\u0131, otomatik derleme ve da\u011f\u0131t\u0131m\u0131n kalbidir. Yukar\u0131daki <\/code>Makefile<code> veya shell scriptleri, bu ortamlarda kolayca entegre edilebilir.<\/p>\n<p><strong>GitHub Actions \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-yaml\"># .github\/workflows\/build.yml\nname: Go Build and Release\n\non:\n  push:\n    branches:\n      - main\n    tags:\n      - 'v<em>.<\/em>.*' # v1.0.0, v1.1.0 gibi tag'ler i\u00e7in\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v4\n      with:\n        fetch-depth: 0 # T\u00fcm commit ge\u00e7mi\u015fini getir, git rev-parse i\u00e7in gerekli\n\n    - name: Set up Go\n      uses: actions\/setup-go@v5\n      with:\n        go-version: '1.22'\n\n    - name: Get version info\n      id: get_version\n      run: |\n        echo \"APP_VERSION=${GITHUB_REF_NAME#v}\" >> $GITHUB_OUTPUT # Tag'den s\u00fcr\u00fcm\u00fc al, \u00f6rn. v1.0.0 -> 1.0.0\n        echo \"COMMIT=$(git rev-parse --short HEAD)\" >> $GITHUB_OUTPUT\n        echo \"BRANCH=$(git rev-parse --abbrev-ref HEAD)\" >> $GITHUB_OUTPUT\n        echo \"BUILD_DATE=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\" >> $GITHUB_OUTPUT\n      shell: bash\n\n    - name: Build\n      run: |\n        MODULE_PATH=\"github.com\/your_username\/your_module_name\"\n        LDFLAGS=\"-X ${MODULE_PATH}\/pkg\/version.Version=${{ steps.get_version.outputs.APP_VERSION }} \\\n                 -X ${MODULE_PATH}\/pkg\/version.Commit=${{ steps.get_version.outputs.COMMIT }} \\\n                 -X ${MODULE_PATH}\/pkg\/version.Branch=${{ steps.get_version.outputs.BRANCH }} \\\n                 -X ${MODULE_PATH}\/pkg\/version.BuildDate=${{ steps.get_version.outputs.BUILD_DATE }}\"\n        go build -ldflags \"${LDFLAGS}\" -o myapp .\/cmd\/myapp\n      env:\n        GOOS: linux\n        GOARCH: amd64\n\n    - name: Upload artifact\n      uses: actions\/upload-artifact@v4\n      with:\n        name: myapp\n        path: myapp<\/code><\/pre>\n<p>Bu GitHub Actions workflow'u:<br \/>\n<em>   <\/code>main<code> branch'ine yap\u0131lan push'larda veya <\/code>v<\/em>.<em>.<\/em><code> format\u0131ndaki tag'lerde tetiklenir.<br \/>\n*   <\/code>fetch-depth: 0<code> ile t\u00fcm Git ge\u00e7mi\u015fini getirir, bu sayede <\/code>git rev-parse<code> do\u011fru \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <\/code>get_version<code> ad\u0131m\u0131, Git ve <\/code>date<code> komutlar\u0131n\u0131 kullanarak s\u00fcr\u00fcm bilgilerini toplar ve bunlar\u0131 <\/code>GITHUB_OUTPUT<code> arac\u0131l\u0131\u011f\u0131yla sonraki ad\u0131mlara aktar\u0131r. Tag'den s\u00fcr\u00fcm numaras\u0131 alma (<\/code>${GITHUB_REF_NAME#v}<code>) burada \u00f6nemli bir otomasyon \u00f6rne\u011fidir.<br \/>\n*   <\/code>Build<code> ad\u0131m\u0131, toplanan s\u00fcr\u00fcm bilgilerini <\/code>ldflags<code> olarak kullanarak uygulamay\u0131 derler.<br \/>\n*   Derlenen ikili dosya, <\/code>upload-artifact<code> ile GitHub Actions'\u0131n artifact'leri aras\u0131na y\u00fcklenir, b\u00f6ylece daha sonra indirilebilir veya da\u011f\u0131t\u0131labilir.<\/p>\n<p>Benzer mant\u0131k, GitLab CI, Jenkins veya di\u011fer CI\/CD platformlar\u0131nda da uygulanabilir. Temel fikir, Git bilgilerini ve derleme zaman\u0131n\u0131 dinamik olarak yakalamak ve bunlar\u0131 <\/code>go build -ldflags<code> komutuna aktarmakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Yap\u0131lan Hatalar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p><\/code>ldflags<code> kullan\u0131rken kar\u015f\u0131la\u015f\u0131labilecek baz\u0131 yayg\u0131n sorunlar ve dikkat edilmesi gereken noktalar \u015funlard\u0131r:<\/p>\n<h4>Yanl\u0131\u015f De\u011fi\u015fken Kapsam\u0131<\/h4>\n<p>*   <strong><\/code>const<code> de\u011fi\u015fkenler:<\/strong> <\/code>ldflags -X<code> sadece <\/code>var<code> ile tan\u0131mlanm\u0131\u015f string de\u011fi\u015fkenlerin de\u011ferini de\u011fi\u015ftirebilir. <\/code>const<code> olarak tan\u0131mlanm\u0131\u015f de\u011fi\u015fkenler derleme zaman\u0131nda sabitlenir ve ba\u011flay\u0131c\u0131 taraf\u0131ndan de\u011fi\u015ftirilemez.<br \/>\n*   <strong>Yanl\u0131\u015f paket yolu:<\/strong> <\/code>ldflags -X<code> komutunda belirtilen paket yolu (<\/code>main.version<code> veya <\/code>your_module_path\/pkg\/version.Version<code>) Go kodunuzdaki de\u011fi\u015fkenin tam yoluyla e\u015fle\u015fmelidir. B\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyarl\u0131l\u0131\u011f\u0131na dikkat edin.<br \/>\n*   <strong>Yerel de\u011fi\u015fkenler:<\/strong> Fonksiyon i\u00e7inde tan\u0131mlanm\u0131\u015f yerel de\u011fi\u015fkenler <\/code>ldflags<code> ile de\u011fi\u015ftirilemez. De\u011fi\u015ftirilecek de\u011fi\u015fkenler global veya paket seviyesinde olmal\u0131d\u0131r.<\/p>\n<h4>Derleme Ortam\u0131 Farkl\u0131l\u0131klar\u0131<\/h4>\n<p>*   <strong>Git deposu olmamas\u0131:<\/strong> CI\/CD ortamlar\u0131nda veya da\u011f\u0131t\u0131m paketlerinde Git deposu bulunmayabilir. Bu durumda <\/code>git rev-parse<code> gibi komutlar hata verecektir. <\/code>Makefile<code> veya shell scriptlerinizde <\/code>|| echo &#8220;none&#8221;<code> gibi fallback mekanizmalar\u0131 kullanarak bu durumu y\u00f6netin.<br \/>\n*   <strong>Zaman dilimi:<\/strong> <\/code>date<code> komutunu kullan\u0131rken UTC format\u0131n\u0131 (<\/code>date -u<code>) tercih etmek, farkl\u0131 derleme ortamlar\u0131nda zaman damgas\u0131 tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in \u00f6nemlidir.<br \/>\n*   <strong>Kabuk farkl\u0131l\u0131klar\u0131:<\/strong> <\/code>bash<code> veya <\/code>sh<code> gibi farkl\u0131 kabuklar aras\u0131nda komut ikamesi (<\/code>$(&#8230;)<code> vs. <\/code><code> <\/code>&#8230;<code> <\/code><code>) veya de\u011fi\u015fken tan\u0131mlama (<\/code>VAR=val<code> vs. <\/code>set VAR=val<code>) farkl\u0131l\u0131klar\u0131 olabilir. Genellikle <\/code>bash<code> uyumlu komutlar en geni\u015f uyumlulu\u011fu sa\u011flar.<\/p>\n<h4>G\u00fcvenlik Konular\u0131 (Hassas Bilgiler)<\/h4>\n<p>*   <strong>Asla hassas bilgileri eklemeyin:<\/strong> <\/code>ldflags<code> arac\u0131l\u0131\u011f\u0131yla API anahtarlar\u0131, veritaban\u0131 kimlik bilgileri, \u00f6zel anahtarlar veya di\u011fer hassas bilgileri uygulaman\u0131za g\u00f6mmeyin. Derlenmi\u015f Go ikili dosyalar\u0131 kolayca tersine m\u00fchendislikle incelenebilir ve bu bilgiler ortaya \u00e7\u0131kar\u0131labilir. Hassas bilgiler her zaman \u00e7al\u0131\u015fma zaman\u0131nda g\u00fcvenli bir \u015fekilde (ortam de\u011fi\u015fkenleri, g\u00fcvenli yap\u0131land\u0131rma hizmetleri, s\u0131r y\u00f6neticileri vb.) y\u00fcklenmelidir. <\/code>ldflags<code> sadece s\u00fcr\u00fcm, derleme zaman\u0131, Git commit gibi meta veriler i\u00e7in uygundur.<\/p>\n<p>Bu noktalara dikkat etmek, <\/code>ldflags<code> kullan\u0131m\u0131n\u0131z\u0131 daha sa\u011flam ve g\u00fcvenli hale getirecektir.<\/p>\n<h3>Alternatif Yakla\u015f\u0131mlar ve Kar\u015f\u0131la\u015ft\u0131rma<\/h3>\n<p><\/code>ldflags<code> Go uygulamalar\u0131na s\u00fcr\u00fcm bilgisi eklemek i\u00e7in g\u00fc\u00e7l\u00fc bir y\u00f6ntem olsa da, baz\u0131 durumlarda farkl\u0131 yakla\u015f\u0131mlar da d\u00fc\u015f\u00fcn\u00fclebilir. Her birinin kendi avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r.<\/p>\n<h4>Embed Paketi<\/h4>\n<p>Go 1.16 ile birlikte tan\u0131t\u0131lan <\/code>embed<code> paketi, derleme zaman\u0131nda statik dosyalar\u0131 (metin dosyalar\u0131, HTML \u015fablonlar\u0131, resimler vb.) do\u011frudan Go ikili dosyas\u0131na g\u00f6mmeyi sa\u011flar. Bu, s\u00fcr\u00fcm bilgisini k\u00fc\u00e7\u00fck bir metin dosyas\u0131na yaz\u0131p bu dosyay\u0131 g\u00f6merek de elde edilebilir.<\/p>\n<p><strong><\/code>version.txt<code> dosyas\u0131:<\/strong><\/p>\n<pre><code class=\"language-\">Version: 1.0.0\nCommit: abcdef123\nBuildDate: 2023-10-27T11:00:00Z<\/code><\/pre>\n<p><strong>Go kodu (<\/code>main.go<code>):<\/strong><\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t_ \"embed\" \/\/ embed paketi i\u00e7in blank import\n\t\"fmt\"\n)\n\n\/\/go:embed version.txt\nvar versionInfo string\n\nfunc main() {\n\tfmt.Println(\"Uygulama Bilgileri:\")\n\tfmt.Println(versionInfo)\n}<\/code><\/pre>\n<p><strong>Derleme s\u00fcreci:<\/strong><br \/>\n\u00d6ncelikle <\/code>version.txt<code> dosyas\u0131n\u0131 olu\u015fturman\u0131z veya g\u00fcncellemeniz gerekir. Bu, bir <\/code>Makefile<code> veya shell scripti ile otomatikle\u015ftirilebilir:<\/p>\n<pre><code class=\"language-bash\"># build.sh\nVERSION=\"1.0.0\"\nCOMMIT=$(git rev-parse --short HEAD 2>\/dev\/null || echo \"none\")\nBUILD_DATE=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\")\n\necho \"Version: $VERSION\" > version.txt\necho \"Commit: $COMMIT\" >> version.txt\necho \"BuildDate: $BUILD_DATE\" >> version.txt\n\ngo build -o myapp<\/code><\/pre>\n<p><strong>Kar\u015f\u0131la\u015ft\u0131rma:<\/strong><br \/>\n*   <strong>Avantajlar:<\/strong><br \/>\n    *   Daha az karma\u015f\u0131k <\/code>go build<code> komutu, <\/code>ldflags<code>'\u0131n uzun stringlerini y\u00f6netme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<br \/>\n    *   G\u00f6m\u00fcl\u00fc i\u00e7eri\u011fi okumak i\u00e7in Go kodu daha basittir.<br \/>\n    *   Sadece s\u00fcr\u00fcm bilgisi de\u011fil, herhangi bir statik dosya g\u00f6m\u00fclebilir.<br \/>\n*   <strong>Dezavantajlar:<\/strong><br \/>\n    *   <\/code>version.txt<code> gibi ge\u00e7ici bir dosyan\u0131n derleme \u00f6ncesinde olu\u015fturulmas\u0131 ve g\u00fcncellenmesi gerekir. Bu, ek bir ad\u0131m ve dosya y\u00f6netimi gerektirir.<br \/>\n    *   <\/code>ldflags<code> do\u011frudan Go de\u011fi\u015fkenlerini manip\u00fcle ederken, <\/code>embed<code> ile g\u00f6m\u00fclen metni ayr\u0131\u015ft\u0131rman\u0131z gerekebilir (\u00f6rne\u011fin, <\/code>key: value<code> format\u0131n\u0131 okumak i\u00e7in).<br \/>\n    *   <\/code>ldflags<code> kadar do\u011frudan ve \"Go-idiomatic\" bir de\u011fi\u015fken enjeksiyonu sa\u011flamaz.<\/p>\n<h4>Yap\u0131land\u0131rma Dosyalar\u0131<\/h4>\n<p>Baz\u0131 uygulamalar, s\u00fcr\u00fcm bilgilerini (ve di\u011fer yap\u0131land\u0131rmalar\u0131) bir JSON, YAML veya TOML dosyas\u0131 gibi harici bir yap\u0131land\u0131rma dosyas\u0131nda tutmay\u0131 tercih edebilir. Uygulama, ba\u015flang\u0131\u00e7ta bu dosyay\u0131 okuyarak s\u00fcr\u00fcm bilgilerini elde eder.<\/p>\n<p><strong><\/code>config.json<code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"version\": \"1.0.0\",\n  \"commit\": \"abcdef123\",\n  \"buildDate\": \"2023-10-27T11:00:00Z\"\n}<\/code><\/pre>\n<p><strong>Go kodu (<\/code>main.go<code>):<\/strong><\/p>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"encoding\/json\"\n\t\"fmt\"\n\t\"io\/ioutil\"\n\t\"log\"\n)\n\ntype AppConfig struct {\n\tVersion   string <\/code>json:\"version\"<code>\n\tCommit    string <\/code>json:\"commit\"<code>\n\tBuildDate string <\/code>json:\"buildDate\"<code>\n}\n\nfunc main() {\n\tconfigData, err := ioutil.ReadFile(\"config.json\")\n\tif err != nil {\n\t\tlog.Fatalf(\"config.json okunamad\u0131: %v\", err)\n\t}\n\n\tvar config AppConfig\n\terr = json.Unmarshal(configData, &config)\n\tif err != nil {\n\t\tlog.Fatalf(\"config.json ayr\u0131\u015ft\u0131r\u0131lamad\u0131: %v\", err)\n\t}\n\n\tfmt.Printf(\"Uygulama S\u00fcr\u00fcm\u00fc: %s\\n\", config.Version)\n\tfmt.Printf(\"Git Commit: %s\\n\", config.Commit)\n\tfmt.Printf(\"Derleme Tarihi: %s\\n\", config.BuildDate)\n}<\/code><\/pre>\n<p><strong>Kar\u015f\u0131la\u015ft\u0131rma:<\/strong><br \/>\n*   <strong>Avantajlar:<\/strong><br \/>\n    *   S\u00fcr\u00fcm bilgileri, uygulaman\u0131n derlenmesinden sonra bile harici olarak de\u011fi\u015ftirilebilir (ancak bu, \"derleme zaman\u0131 s\u00fcr\u00fcm\u00fc\" konseptini zay\u0131flat\u0131r).<br \/>\n    *   Di\u011fer yap\u0131land\u0131rma ayarlar\u0131yla birlikte tutulabilir.<br \/>\n    *   \u00c7al\u0131\u015fma zaman\u0131nda dinamik olarak y\u00fcklenebilir.<br \/>\n*   <strong>Dezavantajlar:<\/strong><br \/>\n    *   Uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in ek bir dosyan\u0131n (yap\u0131land\u0131rma dosyas\u0131) bulunmas\u0131 gerekir. Bu dosya eksik veya bozuk olursa uygulama ba\u015far\u0131s\u0131z olabilir.<br \/>\n    *   \"Tek ikili dosya\" avantaj\u0131n\u0131 kaybeder.<br \/>\n    *   S\u00fcr\u00fcm bilgisinin kayna\u011f\u0131 olarak daha az g\u00fcvenilirdir, \u00e7\u00fcnk\u00fc dosya manip\u00fcle edilebilir.<br \/>\n    *   <\/code>ldflags<code>'\u0131n sa\u011flad\u0131\u011f\u0131 derleme zaman\u0131 statikli\u011fi ve garantiye sahip de\u011fildir.<\/p>\n<p><strong>Sonu\u00e7:<\/strong><br \/>\n<\/code>ldflags<code>, Go uygulamalar\u0131na derleme zaman\u0131nda s\u00fcr\u00fcm bilgisi eklemek i\u00e7in en do\u011frudan, g\u00fcvenilir ve \"Go-idiomatic\" yakla\u015f\u0131md\u0131r. Uygulaman\u0131n tek bir statik ikili dosya olarak kalmas\u0131n\u0131 sa\u011flarken, bu bilgilere programatik olarak eri\u015fimi m\u00fcmk\u00fcn k\u0131lar. <\/code>embed<code> paketi, <\/code>ldflags<code>'a bir alternatif olabilir ancak ek dosya y\u00f6netimi gerektirir. Yap\u0131land\u0131rma dosyalar\u0131 ise genellikle \u00e7al\u0131\u015fma zaman\u0131 yap\u0131land\u0131rmalar\u0131 i\u00e7in daha uygundur ve derleme zaman\u0131 s\u00fcr\u00fcm bilgisinin statik do\u011fas\u0131n\u0131 bozabilir. Bu nedenle, Go uygulamalar\u0131nda s\u00fcr\u00fcm bilgilerini y\u00f6netmek i\u00e7in <\/code>ldflags<code> genellikle tercih edilen y\u00f6ntemdir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Go uygulamalar\u0131nda s\u00fcr\u00fcm bilgilerini <\/code>ldflags<code> kullanarak y\u00f6netmek, uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca izlenebilirli\u011fini, bak\u0131m kolayl\u0131\u011f\u0131n\u0131 ve operasyonel verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131ran kritik bir pratik ve g\u00fc\u00e7l\u00fc bir tekniktir. Bu makalede, <\/code>ldflags<code>'\u0131n ne oldu\u011fundan, neden bu kadar \u00f6nemli oldu\u011funa, Go kodunuzda nas\u0131l kullan\u0131laca\u011f\u0131na ve Git entegrasyonu, derleme zaman\u0131 bilgileri gibi geli\u015fmi\u015f senaryolara kadar geni\u015f bir perspektif sunduk.<\/p>\n<p>\u00d6zellikle CI\/CD pipeline'lar\u0131 ile <\/code>Makefile<code>'lar veya shell scriptleri arac\u0131l\u0131\u011f\u0131yla bu s\u00fcrecin otomasyonu, manuel hatalar\u0131 en aza indirir ve s\u00fcrekli derleme\/da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin ayr\u0131lmaz bir par\u00e7as\u0131 haline gelir. GitHub Actions gibi modern CI\/CD platformlar\u0131nda bu entegrasyonun nas\u0131l yap\u0131laca\u011f\u0131na dair \u00f6rnekler, bu tekni\u011fin g\u00fcn\u00fcm\u00fcz geli\u015ftirme ortamlar\u0131ndaki pratik de\u011ferini ortaya koymu\u015ftur.<\/p>\n<p><\/code>ldflags<code> kullan\u0131rken dikkat edilmesi gerekenler aras\u0131nda, <\/code>var<code> ile tan\u0131mlanm\u0131\u015f string de\u011fi\u015fkenlerin kullan\u0131lmas\u0131, do\u011fru paket yollar\u0131n\u0131n belirtilmesi ve \u00f6zellikle hassas bilgilerin <\/code>ldflags<code> arac\u0131l\u0131\u011f\u0131yla asla uygulamaya g\u00f6m\u00fclmemesi gibi g\u00fcvenlik hususlar\u0131 bulunmaktad\u0131r. Bu noktalara dikkat etmek, uygulaman\u0131z\u0131n hem i\u015flevsel hem de g\u00fcvenli olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Alternatif yakla\u015f\u0131mlar olan <\/code>embed<code> paketi ve harici yap\u0131land\u0131rma dosyalar\u0131 da incelenmi\u015f olup, <\/code>ldflags<code>'\u0131n derleme zaman\u0131 statikli\u011fi ve tek ikili dosya prensibiyle olan uyumu sayesinde, s\u00fcr\u00fcm bilgisi enjeksiyonu i\u00e7in genellikle en uygun \u00e7\u00f6z\u00fcm oldu\u011fu sonucuna var\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>Sonu\u00e7 olarak, her Go geli\u015ftiricisinin <\/code>ldflags` yetene\u011fini anlamas\u0131 ve uygulamalar\u0131nda etkin bir \u015fekilde kullanmas\u0131, daha olgun, y\u00f6netilebilir ve desteklenebilir yaz\u0131l\u0131mlar \u00fcretmelerine yard\u0131mc\u0131 olacakt\u0131r. Bu teknik, uygulaman\u0131z\u0131n &#8220;kimlik kart\u0131&#8221; niteli\u011findeki bilgileri g\u00fcvenilir bir \u015fekilde ta\u015f\u0131mas\u0131n\u0131 sa\u011flayarak, geli\u015ftirme ve operasyonel s\u00fcre\u00e7lerinizde size b\u00fcy\u00fck kolayl\u0131klar sunar.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme\nGiri\u015f\nModern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, bir uygulaman\u0131n hangi s\u00fcr\u00fcm\u00fcn\u00fcn","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-38615","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme\" \/>\n<meta property=\"og:description\" content=\"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, bir uygulaman\u0131n hangi s\u00fcr\u00fcm\u00fcn\u00fcn\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-04T01:41:07+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme\",\"datePublished\":\"2026-02-04T01:41:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/\"},\"wordCount\":1975,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/\",\"name\":\"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-04T01:41:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/","og_locale":"tr_TR","og_type":"article","og_title":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme","og_description":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde, bir uygulaman\u0131n hangi s\u00fcr\u00fcm\u00fcn\u00fcn","og_url":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-04T01:41:07+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme","datePublished":"2026-02-04T01:41:07+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/"},"wordCount":1975,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/","url":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/","name":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-04T01:41:07+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/go-uygulamalarinda-surum-bilgilerini-ldflags-ile-yonetme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go Uygulamalar\u0131nda S\u00fcr\u00fcm Bilgilerini ldflags ile Y\u00f6netme"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38615"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38615\/revisions"}],"predecessor-version":[{"id":38616,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38615\/revisions\/38616"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}