<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TekWizely</title>
    <description>The latest articles on DEV Community by TekWizely (@tekwizely).</description>
    <link>https://dev.to/tekwizely</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F297607%2Fc0f8b19e-c4ef-4fa8-8c60-a69a1a32cbf0.png</url>
      <title>DEV Community: TekWizely</title>
      <link>https://dev.to/tekwizely</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tekwizely"/>
    <language>en</language>
    <item>
      <title>Running Your BATS Tests Against Multiple Bash Versions in GitHub</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Fri, 12 Nov 2021 22:50:11 +0000</pubDate>
      <link>https://dev.to/tekwizely/running-your-bats-tests-against-multiple-bash-versions-in-github-4429</link>
      <guid>https://dev.to/tekwizely/running-your-bats-tests-against-multiple-bash-versions-in-github-4429</guid>
      <description>&lt;p&gt;In this post I'll go over the github workflow I created that allows me to test bash scripts using BATS against multiple versions of Bash.&lt;/p&gt;

&lt;p&gt;TL;DR: See my github workflow : &lt;a href="https://github.com/TekWizely/bash-tpl/blob/main/.github/workflows/bats-multi-bash.yml"&gt;bats-multi-bash.yml&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My Bash Script
&lt;/h3&gt;

&lt;p&gt;The script in question is my &lt;a href="https://github.com/TekWizely/bash-tpl"&gt;Bash-TPL&lt;/a&gt; project, which is a light-weight shell-scripting template engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Testing Framework
&lt;/h3&gt;

&lt;p&gt;I chose &lt;a href="https://github.com/bats-core/bats-core"&gt;BATS&lt;/a&gt; as the testing framework, as its comprehensive, tests are easy to write, and its Bash all the way down !&lt;/p&gt;

&lt;p&gt;I had already written an extensive suite of tests, so I was confident they would reveal any compatibility issues once I figured out how to run them against older Bash versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding Older Bash Versions
&lt;/h3&gt;

&lt;p&gt;In researching &lt;em&gt;how&lt;/em&gt; I was going to run my tests against older bash versions, I discovered the &lt;a href="https://hub.docker.com/_/bash"&gt;Official Bash Docker Repository&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Local Testing
&lt;/h4&gt;

&lt;p&gt;This made running the tests on a specific bash version very easy to do on my local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker --rm -it -v"${PWD}:/bash-tpl" bash:3.2

bash-3.2# apk add bats diffutils
# ...
OK: 8 MiB in 21 packages

bash-3.2# cd /bash-tpl
bash-3.2# bats test

1..92
ok 1 BASH_TPL_TAG_DELIMS: Should do nothing when unset or empty
ok 2 BASH_TPL_TAG_DELIMS: Should error on invalid input
ok 3 BASH_TPL_TAG_DELIMS: Should process valid input
# OK looking good !
# ...
# DOH!
not ok 42 misc-function: escape_regex
not ok 43 misc-function: normalize_directive
# ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Hate Compatibility Much?
&lt;/h4&gt;

&lt;p&gt;So it turned out that my script &lt;strong&gt;only&lt;/strong&gt; worked on Bash 5.1 :(&lt;/p&gt;

&lt;h4&gt;
  
  
  Checking Multiple Bash Versions
&lt;/h4&gt;

&lt;p&gt;Once I identified all of the compatibility issues, I was able to work on fixing them, using the above technique to test against multiple Bash versions.  Specifically, I ran tests against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bash Version 3.2 (&lt;code&gt;bash:3.2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Bash Version 4.4 (&lt;code&gt;bash:4.4&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Bash Version 5.0 (&lt;code&gt;bash:5.0&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Bash Version 5.1 (&lt;code&gt;bash:5.1&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Auto-Detecting Future Issues
&lt;/h3&gt;

&lt;p&gt;Having successfully fixed the compatibility issues, and &lt;a href="https://github.com/TekWizely/bash-tpl/releases/tag/v0.4.0"&gt;making a new release&lt;/a&gt;, I set out to create a github workflow to run these tests for me in the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow Research
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Bash Docker Images
&lt;/h4&gt;

&lt;p&gt;I had to determine &lt;strong&gt;if&lt;/strong&gt; I could utilize the previously discovered Bash docker images within a github workflow.&lt;/p&gt;

&lt;h5&gt;
  
  
  Run a Single Bash Image
&lt;/h5&gt;

&lt;p&gt;My first goal was to determine if I could run the workflow within just a &lt;em&gt;single&lt;/em&gt; docker image.&lt;/p&gt;

&lt;p&gt;Thanks to the well-documented &lt;a href="https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions"&gt;Workflow Syntax For Github Guide&lt;/a&gt;, I discovered the &lt;a href="https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#jobsjob_idcontainer"&gt;jobs.&amp;lt;job_id&amp;gt;.container&lt;/a&gt; configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jobs:
  my_job:
    container:
      image: "bash:3.2"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will run your job steps inside the specified container !&lt;/p&gt;

&lt;h4&gt;
  
  
  Configuring BATS
&lt;/h4&gt;

&lt;p&gt;Next I needed to install BATS into my fresh new Bash container.&lt;/p&gt;

&lt;p&gt;I knew I could issue an &lt;code&gt;apk add bats&lt;/code&gt; command, but I wanted to have more control over the actual version of BATS being used.&lt;/p&gt;

&lt;h5&gt;
  
  
  GitHub Actions Marketplace
&lt;/h5&gt;

&lt;p&gt;I figured I probably wasn't the first person who wanted to run BATS in a workflow, so I searched the &lt;a href="https://github.com/marketplace?type=actions"&gt;github actions marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sure enough, there was already an action for configuring BATS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/marketplace/actions/setup-bats-testing-framework"&gt;https://github.com/marketplace/actions/setup-bats-testing-framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, it allows you to declare &lt;em&gt;which&lt;/em&gt; version of BATS you want to install.&lt;/p&gt;

&lt;p&gt;For me, that was the shiny new &lt;a href="https://github.com/bats-core/bats-core/releases/tag/v1.5.0"&gt;1.5.0&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jobs:
  my_job:
    steps:
      - name: Setup BATS
        uses: mig4/setup-bats@v1
        with:
          bats-version: 1.5.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Multiple Bash Versions
&lt;/h4&gt;

&lt;p&gt;Now that I could successfully run my tests using a single container, it was time to figure out how to use multiple containers.&lt;/p&gt;

&lt;h5&gt;
  
  
  Enter The Matrix
&lt;/h5&gt;

&lt;p&gt;From the github workflow documentation of the &lt;a href="https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix"&gt;jobs.&amp;lt;job_id&amp;gt;.strategy.matrix&lt;/a&gt; strategy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can define a matrix of different job configurations. A matrix allows you to create multiple jobs by performing variable substitution in a single job definition. For example, you can use a matrix to create jobs for more than one supported version of a programming language, operating system, or tool. A matrix reuses the job's configuration and creates a job for each matrix you configure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  Not Exactly New
&lt;/h5&gt;

&lt;p&gt;I first learned about the &lt;a href=""&gt;github workflow matrix&lt;/a&gt; strategy when implementing &lt;a href="https://github.com/jgehrcke/github-repo-stats#tracking-multiple-repos"&gt;github-repo-stats&lt;/a&gt; to save stat history for all of my repositories.&lt;/p&gt;

&lt;h5&gt;
  
  
  But What About Containers?
&lt;/h5&gt;

&lt;p&gt;But I couldn't find any examples of a matrix being used for &lt;code&gt;container&lt;/code&gt; setup.&lt;/p&gt;

&lt;h5&gt;
  
  
  ... Favors The Bold
&lt;/h5&gt;

&lt;p&gt;I decided to give a try anyway - And It Worked !&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jobs:
  my_job:
    strategy:
      matrix:
        bash: ["bash:3.2", "bash:4.4", "bash:5.0", "bash:5.1"]
    container: 
      image: ${{ matrix.bash }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Putting It All Together
&lt;/h3&gt;

&lt;p&gt;Now that I had all the pieces worked out, I could &lt;em&gt;finally&lt;/em&gt; implement my workflow.&lt;/p&gt;

&lt;p&gt;Below is the version of the workflow at the time of posting:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;bats-multi-bash.yml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: BATS Tests

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  workflow_dispatch:

jobs:
  bats:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        bash: ["bash:3.2", "bash:4.4", "bash:5.0", "bash:5.1"]
    container: 
      image: ${{ matrix.bash }}
    steps:
      - name: Install packages
        run: apk add diffutils

      - name: Setup BATS
        uses: mig4/setup-bats@v1.2.0
        with:
          bats-version: 1.5.0

      - name: Checkout code
        uses: actions/checkout@v2

      - name: Run bash-tpl tests
        run: bats test/

      - name: Run template tests
        run: bats test/tpl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;

&lt;p&gt;The BATS tests run successfully on all specified Bash versions, &lt;strong&gt;and they're fast!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NbPqtG2q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eo47fschalyaherrzjy2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NbPqtG2q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eo47fschalyaherrzjy2.png" alt="BATS Test Results Against Multiple Bash Versions" width="309" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Thank you for reading - I hope you found this post helpful.  Please let me know if you have any comments or questions.&lt;/p&gt;

&lt;p&gt;-TekWizely&lt;/p&gt;

</description>
      <category>github</category>
      <category>bash</category>
      <category>testing</category>
      <category>cicd</category>
    </item>
    <item>
      <title>My-Alternatives: A wrapper for update-alternatives offering user-level customizations. Supports Debian, SUSE, and RedHat</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Wed, 10 Nov 2021 21:40:00 +0000</pubDate>
      <link>https://dev.to/tekwizely/my-alternatives-a-wrapper-for-update-alternatives-offering-user-level-customizations-supports-debian-suse-and-redhat-34cc</link>
      <guid>https://dev.to/tekwizely/my-alternatives-a-wrapper-for-update-alternatives-offering-user-level-customizations-supports-debian-suse-and-redhat-34cc</guid>
      <description>&lt;p&gt;I'm excited to announce release v0.7.0 of &lt;code&gt;my-alternatives&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/TekWizely/my-alternatives"&gt;https://github.com/TekWizely/my-alternatives&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My-Alternatives is a light-weight wrapper over update-alternatives, offering user-level customizations.&lt;/p&gt;

&lt;p&gt;Supports Debian, SUSE, and RedHat&lt;/p&gt;




&lt;h2&gt;
  
  
  Easy to Get Started
&lt;/h2&gt;

&lt;p&gt;With my-alternatives, configuring custom alternatives is as easy as:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# initialize my-alternatives
# note: place this in your .profile
$ eval "$( my-alternatives init )"

# customize an alternative
$ my-alternatives select &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;See the &lt;a href="https://github.com/TekWizely/my-alternatives"&gt;Project's Homepage&lt;/a&gt; for more information&lt;/p&gt;




&lt;h2&gt;
  
  
  Release Notes - v0.7.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Re-Write
&lt;/h3&gt;

&lt;p&gt;This release marks a full re-write of the my-alternatives tool, changing it into wrapper for &lt;em&gt;update-alternatives&lt;/em&gt; that manages user-level configurations and uses them when invoking update-alternatives (i.e &lt;code&gt;--admindir&lt;/code&gt; &amp;amp; &lt;code&gt;--altdir&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This new approach makes it much easier to support &lt;strong&gt;all&lt;/strong&gt; available commands for managing your custom alternatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  RedHat
&lt;/h3&gt;

&lt;p&gt;This release also includes support for &lt;em&gt;RedHat&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is significant because RedHat maintains its own implementation of &lt;em&gt;update-alternatives&lt;/em&gt;, which is slightly different than the &lt;em&gt;Debian&lt;/em&gt; version.&lt;/p&gt;

&lt;p&gt;The RedHat version does not include the uber-useful &lt;code&gt;--query&lt;/code&gt; command, making it impossible to integrate it using &lt;em&gt;just&lt;/em&gt; the public API.&lt;/p&gt;

&lt;p&gt;As such, supporting it requires a &lt;em&gt;hack&lt;/em&gt;, exploiting knowledge of the tool's private internals.&lt;/p&gt;

&lt;h3&gt;
  
  
  SUSE
&lt;/h3&gt;

&lt;p&gt;The SUSE implementation of &lt;em&gt;update-alternatives&lt;/em&gt; is really just a re-branded version of the Debian tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple Scripts
&lt;/h3&gt;

&lt;p&gt;As part of introducing RedHat support, this release now includes two versions of the &lt;code&gt;my-alternatives&lt;/code&gt; script, each named according to the primary OS flavor they support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debian / SUSE : &lt;code&gt;my-alternatives-debian&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;RedHat / CentOS : &lt;code&gt;my-alternatives-redhat&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>github</category>
      <category>bash</category>
      <category>alternatives</category>
    </item>
    <item>
      <title>ShowDEV: My-Alternatives - Hacking update-alternatives to make user-level changes</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Wed, 29 Sep 2021 18:39:34 +0000</pubDate>
      <link>https://dev.to/tekwizely/showdev-my-alternatives-hacking-update-alternatives-to-make-user-level-changes-27gm</link>
      <guid>https://dev.to/tekwizely/showdev-my-alternatives-hacking-update-alternatives-to-make-user-level-changes-27gm</guid>
      <description>&lt;p&gt;Introducing My-Alternatives&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TekWizely/my-alternatives"&gt;https://github.com/TekWizely/my-alternatives&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My-Alternatives takes an honest run at making a useful tool to allow you to configure &lt;em&gt;alternatives&lt;/em&gt; (see: &lt;a href="https://www.google.com/search?q=update-alternatives"&gt;update-alternatives&lt;/a&gt;) that only affect your local account / shell sessions.&lt;/p&gt;

&lt;h5&gt;
  
  
  No root/sudo
&lt;/h5&gt;

&lt;p&gt;My-Alternatives does not require &lt;em&gt;root / sudo&lt;/em&gt; privileges to use, as it creates and maintains user-owned &lt;em&gt;alt root&lt;/em&gt; directories that store your alternative links.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Example
&lt;/h3&gt;

&lt;p&gt;Here's a quick example of using &lt;em&gt;my-alterantives&lt;/em&gt; to configure a local override for the &lt;code&gt;pager&lt;/code&gt; alternative:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;confirm current system value for pager&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ which pager

/usr/bin/pager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;take a closer look&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ls -l /usr/bin/pager

lrwxrwxrwx root root  /usr/bin/pager -&amp;gt; /etc/alternatives/pager

$ ls -l /etc/alternatives/pager

lrwxrwxrwx  root  root  /etc/alternatives/pager -&amp;gt; /usr/bin/less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;init my-alternatives&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ eval "$( my-alternatives init )"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;configure pager&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ my-alternatives config pager

There are 2 choices for the alternative pager (providing ${MY_ALTS_ROOT}/bin/pager).

  Selection    Path            Priority   Status
------------------------------------------------------------
  1            /bin/more        50        
  2            /usr/bin/less    77        system value

Type selection number: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;select non-system value '/bin/more'&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;... Type selection number: 1

configured local alternative for pager: /bin/more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;confirm updated value&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ which pager

/tmp/my-alts.abcd/bin/pager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;take a closer look&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ls -l "${MY_ALTS_ROOT}"/bin/pager "${MY_ALTS_ROOT}"/man/man1/pager.1.gz

lrwxrwxrwx  user  group  bin/pager -&amp;gt; /bin/more
lrwxrwxrwx  user  group  man/man1/pager.1.gz -&amp;gt; /usr/share/man/man1/more.1.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Per-Shell Alternatives
&lt;/h3&gt;

&lt;p&gt;The example above shows how to create &lt;em&gt;per-shell&lt;/em&gt; alternatives.&lt;/p&gt;

&lt;p&gt;That is, using &lt;code&gt;my-alternatives init&lt;/code&gt; without specifying a target directory results in the creation and use of a temporary directory that only the current shell session knows about.&lt;/p&gt;
&lt;h3&gt;
  
  
  User-Level Alternatives
&lt;/h3&gt;

&lt;p&gt;You can configure &lt;em&gt;user-level&lt;/em&gt; alternatives by providing a specific init directory i.e:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ eval "$( my-alternatives init ~/.my-alts )"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  More Information
&lt;/h3&gt;

&lt;p&gt;Please see the &lt;a href="https://github.com/TekWizely/my-alternatives"&gt;Project Homepage&lt;/a&gt; for more inrmation.&lt;/p&gt;

&lt;p&gt;Thanks for looking and please let me know if you have any questions!&lt;/p&gt;

&lt;p&gt;-TekWizely&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>github</category>
      <category>bash</category>
      <category>alternatives</category>
    </item>
    <item>
      <title>ShowDEV: Bash-TPL - A smart, lightweight shell script templating engine</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Sat, 18 Sep 2021 16:46:24 +0000</pubDate>
      <link>https://dev.to/tekwizely/showdev-bash-tpl-a-smart-lightweight-shell-script-templating-engine-2623</link>
      <guid>https://dev.to/tekwizely/showdev-bash-tpl-a-smart-lightweight-shell-script-templating-engine-2623</guid>
      <description>&lt;p&gt;I know the landscape is crowded, but I'd like to offer my submission for an Easy To Use / Easy To Maintain template engine:&lt;/p&gt;

&lt;p&gt;Introducing Bash-TPL : A Smart, lightweight shell script templating engine, written in Bash&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TekWizely/bash-tpl"&gt;https://github.com/TekWizely/bash-tpl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  FEATURES
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Lightweight
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Single bash script&lt;/li&gt;
&lt;li&gt;Easy to ship with your project or build process&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Smart Indentation Tracking
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Removes unwanted whitespace from rendered text files&lt;/li&gt;
&lt;li&gt;Encourages well-formatted mix of template tags and textual content&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Generates Reusable Shell Scripts
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Can manage &amp;amp; invoke shell scripts without bash-tpl&lt;/li&gt;
&lt;li&gt;Only need bash-tpl when your source templates change&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Shell Agnostic
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Uses standard printf, variable, and sub-shell constructs&lt;/li&gt;
&lt;li&gt;Templates can target any modern shell&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Supports Includes
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Can organize your templates as smaller, reusable components&lt;/li&gt;
&lt;li&gt;Indentation tracking even works across includes !&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Flexible Delimiter Support
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Can customize all template delimiters&lt;/li&gt;
&lt;li&gt;Can modify delimiters mid-template&lt;/li&gt;
&lt;li&gt;Can include templates with differing delimiters&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Quick Example
&lt;/h4&gt;

&lt;p&gt;As is the way: A quintessential &lt;em&gt;hello world&lt;/em&gt; example is of course in order:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;hello.tpl&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello, &amp;lt;% ${NAME:-World} %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;compile + run&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ source &amp;lt;( bash-tpl hello.tpl )

Hello, World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;compile + run with NAME&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ NAME=TekWizely source &amp;lt;( bash-tpl hello.tpl )

Hello, TekWizely
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;view compiled template&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bash-tpl hello.tpl

printf "%s\n" Hello\,\ "${NAME:-World}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h4&gt;
  
  
  More Information
&lt;/h4&gt;

&lt;p&gt;This hello example is really just the start of what bash-tpl can do.&lt;/p&gt;

&lt;p&gt;There's a full README on the &lt;a href="https://github.com/TekWizely/bash-tpl"&gt;Project Home Page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're looking for an easy solution for creating maintainable templates to generate well-formatted text files, I hope you'll give my project a try.&lt;/p&gt;

&lt;p&gt;I'm happy to answer any questions or work through any use-cases you might have for templates and see how bash-tpl might help.&lt;/p&gt;

&lt;p&gt;Feel free to comment and thanks for looking!&lt;/p&gt;

&lt;p&gt;-TW&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>github</category>
      <category>bash</category>
      <category>templateengine</category>
    </item>
    <item>
      <title>Bingo - Its Homebrew for "go install"</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Mon, 23 Aug 2021 18:20:15 +0000</pubDate>
      <link>https://dev.to/tekwizely/bingo-its-homebrew-for-go-install-48f6</link>
      <guid>https://dev.to/tekwizely/bingo-its-homebrew-for-go-install-48f6</guid>
      <description>&lt;p&gt;Do you love the simplicity of being able to download &amp;amp; compile golang applications with &lt;code&gt;'go install'&lt;/code&gt;, but wish it were easier to manage the compiled binaries?&lt;/p&gt;

&lt;p&gt;Introducing Bingo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub : &lt;a href="https://github.com/TekWizely/bingo"&gt;https://github.com/TekWizely/bingo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bingo makes installing and managing &lt;code&gt;go install&lt;/code&gt;-based packages a lot easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keeps a link between the installed binary and the source package&lt;/li&gt;
&lt;li&gt;Can update / uninstall binaries using the name of the binary (i.e &lt;code&gt;bingo update goimports&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Can install binaries to a location of your choice&lt;/li&gt;
&lt;li&gt;Can control the name of the installed binary&lt;/li&gt;
&lt;li&gt;Can install multiple versions of the same package (using different names for the binaries)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>go</category>
    </item>
    <item>
      <title>pre-commit-golang - v1.0.0-beta.4 - Go Mod Tidy, GoFumpt, StaticCheck</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Sun, 15 Aug 2021 03:23:39 +0000</pubDate>
      <link>https://dev.to/tekwizely/pre-commit-golang-v1-0-0-beta-4-go-mod-tidy-gofumpt-staticcheck-5680</link>
      <guid>https://dev.to/tekwizely/pre-commit-golang-v1-0-0-beta-4-go-mod-tidy-gofumpt-staticcheck-5680</guid>
      <description>&lt;p&gt;Its been a busy week since the v1.0.0-beta.1 announcement.&lt;/p&gt;

&lt;p&gt;Here's a quick recap of recent additions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/TekWizely/pre-commit-golang/releases/tag/v1.0.0-beta.4"&gt;v1.0.0-beta.4&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Support for &lt;a href="https://staticcheck.io/"&gt;staticcheck&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TekWizely/pre-commit-golang/releases/tag/v1.0.0-beta.2"&gt;v1.0.0-beta.2&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Support for &lt;a href="https://golang.org/ref/mod#go-mod-tidy"&gt;go mod tidy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Support for &lt;a href="https://pkg.go.dev/mvdan.cc/gofumpt"&gt;gofumpt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/TekWizely/pre-commit-golang/releases/tag/v1.0.0-beta.1"&gt;v1.0.0-beta.1&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Support for &lt;a href="https://github.com/TekWizely/pre-commit-golang#my-cmd"&gt;invoking custom tools&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an example of invoking custom tools, here's a snippit I gave to a user recently who wanted to invoke &lt;code&gt;golines&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ...
      hooks:
            # Run 'golines -l --dry-run $FILE' for each staged .go file
        -   id: my-cmd
            name: go-lines
            alias: go-lines
            args: [ golines, -l, --dry-run ]

            # Run 'golines -l --dry-run .' in the repo root folder
        -   id: my-cmd-repo
            name: go-lines-repo
            alias: go-lines-preo
            args: [ golines, -l, --dry-run, . ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can read about all pre-commit-golang features on project's homepage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TekWizely/pre-commit-golang"&gt;https://github.com/TekWizely/pre-commit-golang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>github</category>
      <category>git</category>
    </item>
    <item>
      <title>Pre-commit-Golang v1.0.0-beta.1 – Now with support for running custom go tools</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Sat, 07 Aug 2021 01:09:52 +0000</pubDate>
      <link>https://dev.to/tekwizely/pre-commit-golang-v1-0-0-beta-1-now-with-support-for-running-custom-go-tools-eo9</link>
      <guid>https://dev.to/tekwizely/pre-commit-golang-v1-0-0-beta-1-now-with-support-for-running-custom-go-tools-eo9</guid>
      <description>&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;pre-commit-golang is a set of &lt;a href="https://pre-commit.com"&gt;pre-commit&lt;/a&gt; hooks for Golang with support for monorepos, the ability to pass arguments to all hooks, and the ability to invoke custom go tools.&lt;/p&gt;

&lt;p&gt;Quick Links: &lt;a href="https://github.com/TekWizely/pre-commit-golang"&gt;Project Page&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang#hooks"&gt;Available Hooks&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang#installation"&gt;Installation&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang/releases"&gt;Releases&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Release Announcement: v1.0.0-beta.1
&lt;/h2&gt;

&lt;p&gt;I'm excited to announce that v1.0.0 is finally on the horizon !&lt;/p&gt;

&lt;p&gt;This release accomplishes the two biggest things I wanted to reach v1.0.0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invoking Custom Tools&lt;/li&gt;
&lt;li&gt;Removing Duplicate Code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read below to learn more about both of these.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://github.com/TekWizely/pre-commit-golang#readme"&gt;project's readme&lt;/a&gt; for more in-depth documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Due do the extent of new code in this release, I'm first releasing it as a &lt;code&gt;beta&lt;/code&gt; until it has some time in the wild.&lt;/p&gt;

&lt;p&gt;I've done a lot of local testing, but I don't have an automated test suite for the project yet, so please take a minute to report &lt;a href="https://github.com/TekWizely/pre-commit-golang/issues"&gt;issues&lt;/a&gt; if you find any.&lt;/p&gt;




&lt;h3&gt;
  
  
  Invoking Custom Tools
&lt;/h3&gt;

&lt;p&gt;While this project includes builtin hooks for many popular go tools, it's not possible to include builtin hooks for every tool that users might want to use.&lt;/p&gt;

&lt;p&gt;To help accommodate those users, this release introduces the ability to invoke custom go tools.&lt;/p&gt;

&lt;p&gt;Using the &lt;code&gt;my-cmd-*&lt;/code&gt; hooks, you can invoke custom go tools in various contexts.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook ID&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-cmd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'$ARGS[0] [$ARGS[1:]] $FILE'&lt;/code&gt; for each staged .go file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-cmd-mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'cd $(mod_root $FILE); $ARGS[0] [$ARGS[1:]] ./...'&lt;/code&gt; for each staged .go file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-cmd-pkg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'$ARGS[0] [$ARGS[1:]] ./$(dirname $FILE)'&lt;/code&gt; for each staged .go file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-cmd-repo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'$ARGS[0] [$ARGS[1:]]'&lt;/code&gt; in the repo root folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-cmd-repo-mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'cd $(mod_root); $ARGS[0] [$ARGS[1:]] /...'&lt;/code&gt; for each module in the repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;my-cmd-repo-pkg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'$ARGS[0] [$ARGS[1:]] ./...'&lt;/code&gt; in repo root folder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Configuring the hooks
&lt;/h4&gt;

&lt;p&gt;The my-cmd hooks are configured &lt;strong&gt;entirely&lt;/strong&gt; through the pre-commit &lt;code&gt;args&lt;/code&gt; attribute, including specifying which tool to run (ie &lt;code&gt;$ARGS[0]&lt;/code&gt; above)&lt;/p&gt;

&lt;h4&gt;
  
  
  Examples
&lt;/h4&gt;

&lt;p&gt;Here's an example of what it would look like to use the my-cmd hooks to invoke &lt;code&gt;go test&lt;/code&gt; if it wasn't already included:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;.pre-commit-config.yaml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ...
      hooks:
            # Run 'cd $(mod_root $FILE); go test ./...' for each staged .go file
        -   id: my-cmd-mod
            name: go-test-mod
            alias: go-test-mod
            args: [ go, test ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Removing Duplicate Code
&lt;/h3&gt;

&lt;p&gt;This release constitutes a huge re-factoring of the code, moving common logic into the lib/ folder, and removing as much code duplication as possible.&lt;/p&gt;

&lt;p&gt;For example, here is the complete content of &lt;code&gt;go-lint.sh&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/usr/bin/env bash
# shellcheck disable=SC2034  # vars used by sourced script
error_on_output=0
cmd=(golint -set_exit_status)
# shellcheck source=lib/cmd-files.bash
. "$(dirname "${0}")/lib/cmd-files.bash"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thats it !&lt;/p&gt;

&lt;p&gt;This should make it much easier to add new hooks, as well as all hooks being able to take advantage of future bug fixes and enhancements to the common code.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>pre-commit-golang v0.8.3 - Now with revive support</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Sun, 30 May 2021 04:10:47 +0000</pubDate>
      <link>https://dev.to/tekwizely/pre-commit-golang-v0-8-3-now-with-revive-support-5bm5</link>
      <guid>https://dev.to/tekwizely/pre-commit-golang-v0-8-3-now-with-revive-support-5bm5</guid>
      <description>&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;pre-commit-golang is a set of &lt;a href="https://pre-commit.com"&gt;pre-commit&lt;/a&gt; hooks for Golang with support for Modules.&lt;/p&gt;

&lt;p&gt;Quick Links: &lt;a href="https://github.com/TekWizely/pre-commit-golang"&gt;Project Page&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang#hooks"&gt;Available Hooks&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang#installation"&gt;Installation&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang/releases"&gt;Releases&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Release Announcement: v0.8.3
&lt;/h2&gt;

&lt;p&gt;This release adds support for &lt;a href="https://github.com/mgechev/revive"&gt;revive&lt;/a&gt;, a ~6x faster, stricter, configurable, extensible, and beautiful drop-in replacement for golint.&lt;/p&gt;

&lt;h3&gt;
  
  
  revive hooks
&lt;/h3&gt;

&lt;p&gt;The following revive hooks are now available:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook ID&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-revive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'revive [$ARGS] $FILE'&lt;/code&gt; for each staged .go file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-revive-mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'cd $(mod_root $FILE); revive [$ARGS] ./...'&lt;/code&gt; for each staged .go file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-revive-repo-mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'cd $(mod_root); revive [$ARGS] ./...'&lt;/code&gt; for each module in the repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  Installing revive
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get -u github.com/mgechev/revive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Learning More About revive
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mgechev/revive#usage"&gt;https://github.com/mgechev/revive#usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;revive -h&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you use git for your golang project's source control, I hope you will give my project a try.&lt;/p&gt;

&lt;p&gt;I am happy to answer any questions you might have.&lt;/p&gt;

&lt;p&gt;Thank you for your time,&lt;/p&gt;

&lt;p&gt;-TekWizely ( &lt;a href="https://github.com/TekWizely"&gt;https://github.com/TekWizely&lt;/a&gt; )&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>pre-commit-golang v0.8.2 - Now with gosec support</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Sun, 14 Mar 2021 02:01:16 +0000</pubDate>
      <link>https://dev.to/tekwizely/pre-commit-golang-v0-8-2-now-with-gosec-support-6b8</link>
      <guid>https://dev.to/tekwizely/pre-commit-golang-v0-8-2-now-with-gosec-support-6b8</guid>
      <description>&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;pre-commit-golang is a set of &lt;a href="https://pre-commit.com"&gt;pre-commit&lt;/a&gt; hooks for Golang with support for Modules.&lt;/p&gt;

&lt;p&gt;Quick Links: &lt;a href="https://github.com/TekWizely/pre-commit-golang"&gt;Project Page&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang#hooks"&gt;Available Hooks&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang#installation"&gt;Installation&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/pre-commit-golang/releases"&gt;Releases&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Release Announcement: v0.8.2
&lt;/h2&gt;

&lt;p&gt;This release adds support for &lt;a href="https://github.com/securego/gosec"&gt;gosec&lt;/a&gt;, a popular golang security checker.&lt;/p&gt;

&lt;h3&gt;
  
  
  go-sec hooks
&lt;/h3&gt;

&lt;p&gt;The following gosec hooks are now available:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook ID&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-sec-mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'cd $(mod_root $FILE); gosec [$ARGS] ./...'&lt;/code&gt; for each staged .go file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-sec-pkg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'gosec [$ARGS] ./$(dirname $FILE)'&lt;/code&gt; for each staged .go file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-sec-repo-mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'cd $(mod_root); gosec [$ARGS] ./...'&lt;/code&gt; for each module in the repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go-sec-repo-pkg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;'gosec [$ARGS] ./...'&lt;/code&gt; in repo root folder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h5&gt;
  
  
  Installing gosec
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get github.com/securego/gosec/v2/cmd/gosec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Learning More About gosec
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/securego/gosec#usage"&gt;https://github.com/securego/gosec#usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gosec (no args)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you use git for your golang project's source control, I hope you will give my project a try.&lt;/p&gt;

&lt;p&gt;I am happy to answer any questions you might have.&lt;/p&gt;

&lt;p&gt;Thank you for your time,&lt;/p&gt;

&lt;p&gt;-TekWizely ( &lt;a href="https://github.com/TekWizely"&gt;https://github.com/TekWizely&lt;/a&gt; )&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>github</category>
    </item>
    <item>
      <title>Run v0.7.2 - Easily manage and invoke small scripts and wrappers</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Wed, 18 Mar 2020 20:34:28 +0000</pubDate>
      <link>https://dev.to/tekwizely/run-v0-7-2-easily-manage-and-invoke-small-scripts-and-wrappers-52lh</link>
      <guid>https://dev.to/tekwizely/run-v0-7-2-easily-manage-and-invoke-small-scripts-and-wrappers-52lh</guid>
      <description>&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;Do you find yourself using tools like make to manage non build-related scripts?&lt;/p&gt;

&lt;p&gt;Build tools are great, but they are not optimized for general script management.&lt;/p&gt;

&lt;p&gt;Run aims to be better at managing small scripts and wrappers, while incorporating a familiar make-like syntax.&lt;/p&gt;

&lt;p&gt;Quick Links: &lt;a href="https://github.com/TekWizely/run"&gt;Project Page &lt;/a&gt; | &lt;a href="https://github.com/TekWizely/run#examples"&gt;Examples&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/run#installing"&gt;Installing&lt;/a&gt; | &lt;a href="https://github.com/TekWizely/run/releases"&gt;Releases&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Update - v0.7.2
&lt;/h2&gt;

&lt;p&gt;You can read about the new features and bug fixes below.&lt;/p&gt;

&lt;p&gt;If you've been following run, I hope you'll find these updates useful.&lt;/p&gt;

&lt;p&gt;If this your first time reading about run, and if you're at all interested in managing task runners and scripts, I hope you will give my project a try.&lt;/p&gt;

&lt;p&gt;I am happy to answer any questions you might have.&lt;/p&gt;

&lt;p&gt;Thank you,&lt;/p&gt;

&lt;p&gt;-TekWizely&lt;/p&gt;




&lt;h2&gt;
  
  
  New Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Assertions
&lt;/h3&gt;

&lt;p&gt;Assertions let you check against expected conditions, exiting with an error message when checks fail.&lt;/p&gt;

&lt;p&gt;Assertions have the following syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ASSERT &amp;lt;condition&amp;gt; [ "&amp;lt;error message&amp;gt;" | '&amp;lt;error message&amp;gt;' ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; The error message is optional and will default to &lt;code&gt;"Assertion failed"&lt;/code&gt; if not provided&lt;/p&gt;

&lt;h3&gt;
  
  
  Condition
&lt;/h3&gt;

&lt;p&gt;The following condition patterns are supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[  ...  ]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[[ ... ]]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(  ...  )&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(( ... ))&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Assertion Example
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Runfile&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;##
# Not subject to any assertions
world:
    echo Hello, World

# Assertion applies to ALL following commands
ASSERT [ -n "${HELLO}" ] "Variable HELLO not defined"

##
# Subject to HELLO assertion, even though it doesn't use it
newman:
    echo Hello, Newman

##
# Subject to HELLO assertion, and adds another
# ASSERT [ -n "${NAME}" ] 'Variable NAME not defined'
name:
    echo ${HELLO}, ${NAME}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;example with no vars&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ run world

Hello, World

$ run newman

run: Variable HELLO not defined

$ run name

run: Variable HELLO not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;example with HELLO&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ HELLO=Hello run newman

Hello, Newman

$ HELLO=Hello run name

run: Variable NAME not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;example with HELLO and NAME&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ HELLO=Hello NAME=Everybody run name

Hello, Everybody
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Assertions only apply to commands and are only checked when a command is invoked.  Any globally-defined assertions will apply to ALL commands defined after the assertion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ignoring Script Lines
&lt;/h2&gt;

&lt;p&gt;You can use a &lt;code&gt;#&lt;/code&gt; on the first column of a command script to ignore a line:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Runfile&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hello:
    # This comment WILL be present in the executed command script
    echo "Hello, Newman"
# This comment block WILL NOT be present in the executed command script
#   echo "Hello, World"
    echo "Goodbye, now"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Run detects and skips these comment lines when parsing the runfile, so the &lt;code&gt;#&lt;/code&gt; will work regardless of what language the script text is written in (i.e even if the target language doesn't support &lt;code&gt;#&lt;/code&gt; for comments).&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>tools</category>
      <category>github</category>
    </item>
    <item>
      <title>Bingo v0.2.0 - Its Homebrew for "Go Get" - Now With Update and Version Support!</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Thu, 12 Mar 2020 15:56:40 +0000</pubDate>
      <link>https://dev.to/tekwizely/bingo-v0-2-0-its-homebrew-for-go-get-now-with-update-and-version-support-2bk8</link>
      <guid>https://dev.to/tekwizely/bingo-v0-2-0-its-homebrew-for-go-get-now-with-update-and-version-support-2bk8</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Do you love the simplicity of being able to download &amp;amp; compile golang applications with &lt;code&gt;'go get'&lt;/code&gt;, but wish it were easier to manage the compiled binaries?&lt;/p&gt;

&lt;p&gt;Introducing Bingo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub : &lt;a href="https://github.com/TekWizely/bingo"&gt;https://github.com/TekWizely/bingo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bingo makes installing and managing golang-compiled binaries a bit easier.&lt;/p&gt;

&lt;h4&gt;
  
  
  Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Keeps a link between the installed binary and the source package&lt;/li&gt;
&lt;li&gt;Can install binaries to a location of your choice&lt;/li&gt;
&lt;li&gt;Can control the name of the installed binary&lt;/li&gt;
&lt;li&gt;Can install multiple versions of the same package (using different names for the binary)&lt;/li&gt;
&lt;li&gt;Each binary's source package is isolated and managed in its own separate &lt;code&gt;$GOROOT&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Release Announcement: v0.2.0
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Highlights
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Update Support&lt;/strong&gt;&lt;br&gt;
You can now update existing binaries&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version Support&lt;/strong&gt;&lt;br&gt;
You can now specify which version of a package to install or update&lt;/p&gt;


&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;Below are some quick usage examples. See the project's homepage for more detailed documentation and installation instructions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install package latest version as "hello"
$ bingo install github.com/golang/example/hello

# Install specific version
$ bingo install github.com/golang/example/hello@v1.2.3

# Install package with a different binary name
$ bingo install -n foo github.com/golang/example/hello

# Update a binary to latest version
$ bingo update hello

# Update a binary to specific version
$ bingo update hello@v1.2.3

# List installed binaries
$ bingo installed

# Display a binary's associated package
$ bingo package hello

# Uninstall a binary and associated package folder
$ bingo uninstall foo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If you're looking for better ways to manage binaries installed via &lt;code&gt;'go get'&lt;/code&gt;, I hope you will give my project a try.&lt;/p&gt;

&lt;p&gt;I am happy to answer any questions you might have.&lt;/p&gt;

&lt;p&gt;Thank you for your time,&lt;/p&gt;

&lt;p&gt;-TekWizely ( &lt;a href="https://github.com/TekWizely"&gt;https://github.com/TekWizely&lt;/a&gt; )&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>tools</category>
    </item>
    <item>
      <title>Show DEV: Bingo - The missing package manager for golang binaries</title>
      <dc:creator>TekWizely</dc:creator>
      <pubDate>Mon, 17 Feb 2020 20:11:48 +0000</pubDate>
      <link>https://dev.to/tekwizely/show-dev-bingo-the-missing-package-manager-for-golang-binaries-4bee</link>
      <guid>https://dev.to/tekwizely/show-dev-bingo-the-missing-package-manager-for-golang-binaries-4bee</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Do you love the simplicity of being able to download &amp;amp; compile golang applications with &lt;code&gt;'go get'&lt;/code&gt;, but wish it were easier to manage the compiled binaries?&lt;/p&gt;

&lt;p&gt;Introducing Bingo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub : &lt;a href="https://github.com/TekWizely/bingo"&gt;https://github.com/TekWizely/bingo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bingo makes installing and managing golang-compiled binaries a bit easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keeps a link between the installed binary and the source package&lt;/li&gt;
&lt;li&gt;Can install binaries to a location of your choice&lt;/li&gt;
&lt;li&gt;Can control the name of the installed binary&lt;/li&gt;
&lt;li&gt;Can install multiple versions of the same package (using different names for the binary)&lt;/li&gt;
&lt;li&gt;Each binary's source package is isolated and managed in its own separate &lt;code&gt;$GOROOT&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Compiling + Installing Binaries
&lt;/h3&gt;

&lt;p&gt;To install a binary with bingo, use the golang application's full package path, same as you would with &lt;code&gt;'go get'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;hello example&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bingo install github.com/golang/example/hello

Installing binary hello from package github.com/golang/example/hello
Downloading package (folder: '~/.bingo/pkg/hello')
Compiling package
Installing binary (file: '~/.bingo/bin/hello')
Done

$ ~/.bingo/bin/hello

Hello, Go examples!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Binary Naming
&lt;/h4&gt;

&lt;p&gt;By default, the installed binary will be named after the last folder element in its package path.&lt;/p&gt;

&lt;p&gt;As you saw above, installing the &lt;code&gt;github.com/golang/example/hello&lt;/code&gt; package installed a binary named &lt;code&gt;hello&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can override this behavior and specify the binary name at the time of installation:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;install hello example as 'foo'&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bingo install -n foo -q github.com/golang/example/hello

$ ~/.bingo/bin/foo

Hello, Go examples!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Listing Installed Binaries
&lt;/h3&gt;

&lt;p&gt;To see a list of installed binaries, use the &lt;code&gt;installed&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bingo installed -p

Bingo-managed binaries (folder: '~/.bingo/bin')

 - foo github.com/golang/example/hello
 - hello github.com/golang/example/hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Displaying A Binary's Associated Package
&lt;/h2&gt;

&lt;p&gt;If you need a reminder of which package a binary was compiled/installed from, you can use the &lt;code&gt;package&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bingo package hello

github.com/golang/example/hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Uninstalling Binaries / Packages
&lt;/h3&gt;

&lt;p&gt;Use the &lt;code&gt;uninstall&lt;/code&gt; command to uninstall binaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bingo uninstall foo

Uninstalling binary foo from package github.com/golang/example/hello
Removing binary (file: '~/.bingo/bin/foo')
Removing package (folder: '~/.bingo/pkg/foo')
Done

$ bingo installed -q

hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;NOTE&lt;/em&gt;: Uninstalling a binary also removes the associated package folder.&lt;/p&gt;




&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Run
&lt;/h3&gt;

&lt;p&gt;Bingo exists as a Runfile, and requires the Run tool to operate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TekWizely/run"&gt;https://github.com/TekWizely/run&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bash
&lt;/h3&gt;

&lt;p&gt;Bingo (currently) uses &lt;code&gt;bash&lt;/code&gt; for its command scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Readlink
&lt;/h3&gt;

&lt;p&gt;Bingo uses symbolic links to associate binaries to their packages.&lt;/p&gt;

&lt;p&gt;The scripts use &lt;code&gt;readlink&lt;/code&gt; to resolve symbolic links.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing Bingo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Releases
&lt;/h3&gt;

&lt;p&gt;See the &lt;a href="https://github.com/TekWizely/bingo/releases"&gt;Releases&lt;/a&gt; page for downloadable archives of versioned releases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brew Tap
&lt;/h3&gt;

&lt;p&gt;While brew core support is in the works, I have also created a tap to ensure the latest version is always available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TekWizely/homebrew-tap"&gt;https://github.com/TekWizely/homebrew-tap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;install bingo directly from tap&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ brew install tekwizely/tap/bingo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;install tap to track updates&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ brew tap tekwizely/tap

$ brew install bingo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;See the &lt;a href="https://github.com/TekWizely/bingo#work-folders"&gt;Work Folders&lt;/a&gt; section on the project's main page for details on configuring the various folders needed by bingo, including which folder to install binaries in.&lt;/p&gt;




&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;tekwizely/bingo&lt;/code&gt; project is released under the &lt;a href="https://opensource.org/licenses/MIT"&gt;MIT&lt;/a&gt; License.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion - A Toy Trying To Take Itself Seriously
&lt;/h2&gt;

&lt;p&gt;Although designed as a set of toy scripts to play around with the idea, bingo is trying to take itself seriously and make a real run at being a useful tool.&lt;/p&gt;

&lt;p&gt;If you're looking for better ways to manage binaries installed via &lt;code&gt;'go get'&lt;/code&gt;, I hope you will give my project a try.&lt;/p&gt;

&lt;p&gt;I am happy to answer any questions you might have.&lt;/p&gt;

&lt;p&gt;Thank you for your time,&lt;/p&gt;

&lt;p&gt;-TekWizely ( &lt;a href="https://github.com/TekWizely"&gt;https://github.com/TekWizely&lt;/a&gt; )&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
