3.9. Troubleshooting
The problems new users actually hit, and what to do about each.
A command is not found
mim: command not found means the install directory is not on your PATH. The
installer never edits your shell startup files; it prints the exact command for
your shell when the destination is missing, and you have to open a new shell
afterwards. On macOS this is the normal case rather than the exception, because
the default PATH is built from /etc/paths, which does not include
~/.local/bin.
morloc: command not found is different and usually means the install worked.
morloc lives inside an environment, not on your host PATH. Reach it with
mim run — morloc …, or open a mim shell and drop the prefix. mim is
the only executable that lands on your PATH.
Behind a corporate firewall
A TLS-inspecting proxy re-signs every HTTPS connection with a private CA, so
downloads fail certificate verification and mim new stops partway through.
Point mim at your organization’s CA:
$ mim new base --cert-bundle /path/to/corp-ca.pem
$ mim modify --env base --cert-bundle /path/to/corp-ca.pem # after it rotates
The file is PEM or DER and holds your CA certificates only — mim supplies
the public roots itself. Everything it runs that fetches — curl, pixi,
conda, git, cargo, the language runtimes — is then pointed at the result
through SSL_CERT_FILE, REQUESTS_CA_BUNDLE, CURL_CA_BUNDLE,
CONDA_SSL_VERIFY, NODE_EXTRA_CA_CERTS, GIT_SSL_CAINFO and
CARGO_HTTP_CAINFO.
Obtaining the certificate is your IT department’s business, not Morloc’s, and
--cert-bundle is the whole of Morloc’s interface to it. It is usually already
on the machine. On macOS, admin-installed certificates are in the system
keychain, separate from Apple’s public roots:
$ security find-certificates -a -p /Library/Keychains/System.keychain > corp-ca.pem
On Linux, if the host already trusts the CA it is in the system store. Prefer the drop-in directory: it holds the certificates your organization added, where the trusted bundle mixes them in with several hundred public roots.
| Distribution | Trusted bundle | Drop-in directory |
|---|---|---|
Debian, Ubuntu |
|
|
RHEL, Fedora |
|
|
Arch |
|
|
SUSE |
|
|
Those directories hold loose .crt files and --cert-bundle takes one file,
so concatenate them when there is more than one:
$ cat /usr/local/share/ca-certificates/*.crt > corp-ca.pem
mim validates the file before it builds anything and prints what it found:
per certificate, the subject, whether it is a CA, whether it is self-signed,
the validity dates and a SHA-256 fingerprint. It refuses the file when:
-
it is empty, or over 1 MiB — a CA bundle is a handful of certificates, so this is almost always the wrong file
-
it contains private key material — export the certificate, not the key
-
it is DER but not an X.509 certificate, such as a key or a PKCS#12 archive
-
it is text — most often a proxy error page saved with a
.pemextension -
nothing in it decodes as a certificate
An expired or not-yet-valid certificate is reported as a warning rather than a refusal, because a skewed system clock looks identical from here. PEM blocks that fail to parse are skipped and named, not treated as fatal.
Afterwards mim doctor compares the source file against the fingerprints the
environment was built with, which is how you find out the CA rotated under you.
The first build takes several minutes
Expected. mim new downloads the Morloc compiler, solves a conda toolchain and
builds the Morloc runtime from source against it. Your first morloc make in a
language you have not used yet pauses again to provision that language. Both
results are cached: later environments reuse the downloaded compiler, and a
solve with unchanged requirements is skipped entirely.
An import fails on a fresh environment
morloc make fetches a missing module; morloc typecheck, dump and eval
do not. Build the program once, or run morloc install <module> by hand, and
the import resolves for every command afterwards. Writing code that is not tied to a language covers
this.
If the fetch itself fails rather than being skipped, it is a network problem — see the firewall entry above.
Something else
$ mim doctor # check the default environment
$ mim doctor --env base # or a named one
$ mim doctor --deep # also run checks inside the container; slower
--strict makes it exit non-zero on warnings, which is what you want in CI.