Install dev tools in make install way.
Named after the first city in recorded history, Uruk is designed to simplify installing dev tools on a new mac.
Notice that it only works on macOS for now.
One-line installation - No need to clone the repository:
curl -fsSL https://raw.githubusercontent.com/medopaw/uruk/master/remote-install.sh | bashThis will:
- 🚀 Automatically download and set up Uruk in a temporary directory
- 🔍 Scan all available installation targets and generate a configuration file
- ✏️ Open your preferred editor to customize which tools to install
- ⚡ Run the installation with your selected tools
- 🧹 Clean up temporary files automatically
Essential tools like git are enabled by default. You can add more by uncommenting lines in the configuration file.
To enable debug output for troubleshooting:
URUK_DEBUG=1 curl -fsSL https://raw.githubusercontent.com/medopaw/uruk/master/remote-install.sh | bashThis will show detailed information about:
- Directory operations and file checks
- Configuration file processing
- Target discovery and parsing
- Installation command execution
If you prefer to customize before running, or want to keep the repository locally:
git clone https://github.com/medopaw/uruk.gitOr download https://github.com/medopaw/uruk/archive/master.zip and extract to local directory.
First enter Uruk directory.
cd uruk # Or `cd uruk-master` if it's extracted from github zip fileAnd then you can install all things your need in just one line.
make installIf a popup update window appears and ask you to install xcode-select command line developer tools, click "Install" and wait till it finishes.
By default, this will install git (brew version) and rust if nothing modified.
Uruk provides several commands to help you manage installation targets. You can use either make commands or run the shell scripts directly.
Show all available commands and usage information:
make help
# or run make without arguments
makeInstall all tools specified in configuration files:
make install
# Alternative: run install.sh directly
chmod +x install.sh
./install.shAdd a new installation target interactively:
make add-target
# Alternative: run add-target.sh directly
chmod +x add-target.sh
./add-target.shAdd a new target with a specific name (will prompt for type and other details):
make add-target vim
# Alternative: run add-target.sh directly
chmod +x add-target.sh
./add-target.sh vimEdit configuration file (creates custom.conf from default.conf if it doesn't exist):
make edit-config
# Or specify a specific editor
make edit-config code
make edit-config zed
make edit-config nano
# Alternative: run edit-config.sh directly
chmod +x edit-config.sh
./edit-config.sh
# Or with specific editor
./edit-config.sh codeThis command will:
- Open
custom.conffor editing if it exists - Copy
default.conftocustom.confand then open it ifcustom.confdoesn't exist - Use the specified editor if provided as an argument
- Use the
$EDITORenvironment variable if set and no editor specified - If
$EDITORis not set, automatically detect and usenanoorvi - If both
nanoandviare available, present a selection menu
Show all available installation targets:
make list-targets
# Alternative: run list-targets.sh directly
chmod +x list-targets.sh
./list-targets.shShow currently installed targets:
make list-installed
# Alternative: run list-installed.sh directly
chmod +x list-installed.sh
./list-installed.shShow targets that are not installed:
make list-uninstalled
# Alternative: run list-uninstalled.sh directly
chmod +x list-uninstalled.sh
./list-uninstalled.shFormat custom.conf with default.conf structure:
make format-config
# Alternative: run format-config.sh directly
chmod +x format-config.sh
./format-config.shAll listing commands support a --simple flag for script-friendly output:
make list-targets ARGS="--simple"
make list-installed ARGS="--simple"
make list-uninstalled ARGS="--simple"
# Alternative: run scripts directly
./list-targets.sh --simple
./list-installed.sh --simple
./list-uninstalled.sh --simpleUruk is shipped with default.conf to make it work out-of-box. It is recommend to create custom.conf to override default settings.
If custom.conf is found, default.conf in the same directory will be ignored.
And custom.conf is in .gitignore, so that you can keep your own configuration and don't have to merge with new git commits after updating Uruk.
Of course you can edit default.conf directly and include changes and submit to git commit and share with other developers.
You can configure multiple tools in custom.conf like this:
python
rubyor
python rubyAnd then run
make installand both python and ruby will be installed.
If no custom.conf was found, Uruk will read from default.conf.
You can add new installation targets using the make add-target command. This will interactively guide you through creating the necessary files for a new target:
make add-target
# or with a specific name
make add-target newtoolThis automatically updates the README with the new target in the supported targets list.
Uruk use command -v to check if a target is installed. You can specify different checking method in is_installed.sh in the folder with target name.
The status code explicitly or implicitly returned from is_installed will be used to check if it is installed: 0 means installed, otherwise not installed.
Often a customized is_installed is needed if you want to use brew or other installed version instead of system default version.
You can also specify targets to install directly in the command-line:
make install python ruby
# Alternative: run install.sh directly
chmod +x install.sh
./install.sh python ruby- ai-assistant-cli
- alfred
- autojump
- baiduinput
- baidunetdisk
- bat
- brew
- caffeinate
- cargo-update
- ccusage
- chatgpt
- chromium
- cmake
- confetty-tui
- coreutils
- countdown-tui
- create-dmg
- docker
- doomemacs
- dropbox
- emacs
- fd
- ffmpeg
- firefox
- fselect
- fzf
- gh
- git
- git-delta
- git-lfs
- github
- google-chrome
- hammerspoon
- im-select
- iterm2
- jenv
- json-helper
- just
- karabiner-elements
- localsend
- location-helper
- loopback
- makers
- mas
- mise
- neteasemusic
- node
- oh-my-zsh
- ollama
- onedrive
- p4merge
- pycharm-ce-with-anaconda-plugin
- pyenv
- python
- qqmusic
- quickmail
- ranger
- rbenv
- rg
- rsync
- ruby
- rust
- sogouinput
- sox
- sublime-text
- switchhosts
- tig
- tldr
- vim
- visual-studio-code
- windows-app
- xcode-command-line-tools
- xnviewmp
- zed
All depended targets will be installed first. The dependency is specified in installation scripts by calling install_if_needed. You can modify installation script to customize your own installation.
For what is shipped, e.g. pyenv, fzf and brew will be installed before installing python.
For every install target (i.e. python, ruby, etc.), Uruk decides which install script(s) should be run first by retrieving name(s) from:
- Command-line parameter
- Read from
custom.conf. Content in this file will be treated as an array separated by any blank characters. - Read from
default.conf. The format is the same withcustom.conf.
For each name retrieved in step 1 or 2, Uruk will try to resolve it and run specific script. Let's say the name is "python" --
- If
targets/python/is_installed.shexists, use its returned value (trueor0means installed, otherwise not installed) - If
targets/python.brewtargetexists, treat it as a brew target and check ifbrew list pythonhas0exit code. - If
targets/python.casktargetexists, treat it as a cask target and check ifbrew list --cask pythonhas0exit code. - If
targets/python.mastargetexists, treat it as a Mac App Store target and read MAS ID from it and check ifmas list | grep "^$mas_id"has0exit code. - Run
command -v pythonto check ifpythonis installed
- Uruk will try to run
python/install.sh. - If
python/install.shdoes not exist, Uruk will try to runpython.shunder current directory instead. - If
python.shdoes not exist either, a message will appear, telling you Uruk can't locate any install script. - If
targets/python.brewtargetexists, treat it as a brew target and runbrew install python. - If
targets/python.casktargetexists, treat it as a cask target and runbrew install python. - If
targets/python.mastargetexists, treat it as a Mac App Store target and read MAS ID form it and runmas install $mas_id.