skip to Main Content

I’m working on a code snippet which has to work across multiple themes.

Let’s say I have three themes:

  • Orange
  • Green
  • Blue

Every theme has a folder called “snippets” inside, and I put my code snippet there.

  • Orange/snippets/code.html
  • Green/snippets/code.html
  • Blue/snippets/code.html

The “code.html” file is exactly the same across every theme. I keep track of it in its own GitHub repo and then copy and paste to every theme repo.

How can I edit this snippet in one place and be sure that it gets updated in all themes? I’m looking for a method that would be scalable, as soon the number of themes may grow till 20-30.

In my situation I have more files then an example with “code.html” – they are in two folders, and the total amount is around 10.

I was reading about Git submodules, but I don’t feel confident like they fit my issue. I’m not sure if this issue is related to Git at all, sorry about that.

P.S. I’m working on SaaS – Shopify to be exact. So any kind of PHP tricks will not work in this case. I need files to be processed in some way locally.

Edit: Real life example:

I have those 4 files:

{{ theme }}/snippets/file1.liquid
{{ theme }}/snippets/file2.liquid
{{ theme }}/assets/file3.liquid
{{ theme }}/assets/file4.liquid

I cannot create sub-directories or other directories.

3

Answers


  1. A Php file structure like the one you listed above would work. The snippets folder would essentially be a .php extension file with an include for a shared html file between projects or in your case themes.

    Login or Signup to reply.
  2. Let say you have your common code in a repository.
    You could create a submodule in <Theme>/snippets/common. And keep it updated to the latest master every time you want to build/deploy your theme.

    That means your code.html will be in <Theme>/snippets/common/code.html

    cd <Theme>/snippets
    
    # To add the submodule 
    git submodule add <common code repository> common
    # 2 new files will be added to the repository
    # .gitmodules and the "common" folder
    
    # When you clone the repo in another machine
    # Always do the following command 
    # to get the files from the common repository
    git submodule update --init
    
    # If you made a change in the common repository
    git submodule update --remote
    
    Login or Signup to reply.
  3. Perhaps you can use a bash script that automate this process across your repos. The following script will take all of the file paths that you set in the first variable and find the one modified last. From there it will copy that file unto all the rest of them, add them to the repo, and commit.

    #!/usr/bin/env bash
    
    declare -a filePaths=("Orange/snippets/code.html" "Green/snippets/code.html" "Blue/snippets/code.html")
    declare newestFile
    
    for file in "${filePaths[@]}"; do
    echo "current file is $file"
    if [[ "$file" -nt ${newestFile} ]];
    then
    newestFile="${file}"
    fi
    echo "newest file is ${newestFile}"
    done
    
    for file in "${filePaths[@]}"; do
    if ! [[ "$file" -ef $newestFile ]];
    then
    echo "copying ${newestFile} to ${file}"
    cp ${newestFile} ${file}
    currentDir=`dirname "${file}"`
    cd ${currentDir}
    git add ${file}
    git commit -m 'automatic update commit'
    fi
    done
    

    After you’ve modified the code.hmtl file, you could run this script or make it part of your production pipeline.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search