4
\$\begingroup\$

I packaged a pure python library using conda. It is tested to work with 2.7, 3.5 and 3.6 and should work on all three mayor operating systems.

I am quite surprised, that there is no command or option like conda-build-all. Instead I have to build and convert manually.

So there are two questions:

Is the idea to just put the tasks into a shell script sane? It feels wrong.

Is the shell script written in a maintaineable manner?

#!/bin/sh

# ====================================================
# Please note the bug, that for conda-build the option '--output' does
# not respect the directories given by '--output-folder':
# https://github.com/conda/conda-build/issues/1957
# ====================================================

tmp=$(dirname $(conda-build --output .))
system=$(basename $tmp)
root_dir=$(dirname $tmp)


for py_version in '2.7' '3.5' '3.6'
do
  package_name=$(basename $(conda-build --python ${py_version} --output .))
  package_path="${root_dir}/${py_version}/${system}/${package_name}"

  conda-build --no-anaconda-upload \
              --python ${py_version} \
              --output-folder "${root_dir}/${py_version}" .
  for platform in 'osx-64' 'linux-32' 'linux-64' 'win-32' 'win-64'
  do
    conda-convert -p ${platform} -o "${root_dir}/${py_version}" ${package_path}
    anaconda upload "${root_dir}/${py_version}/${platform}/${package_name}"
  done
done

PS: Here you can find the module and the shell script.

\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

Quoting

It's recommended to quote variables in command arguments that might contain spaces, for example here:

tmp=$(dirname "$(conda-build --output .)")
system=$(basename "$tmp")
root_dir=$(dirname "$tmp")

The version numbers here don't contain characters that the shell would interpret, so you could drop all the single quotes. But you don't have to.

for py_version in '2.7' '3.5' '3.6'

Here again:

package_name=$(basename $(conda-build --python ${py_version} --output .))

It would be better to quote the command arguments:

package_name=$(basename "$(conda-build --python ${py_version} --output .)")

I wouldn't double-quote ${py_version} though, because we have established earlier that it cannot possibly contain special characters.

This is fine:

package_path="${root_dir}/${py_version}/${system}/${package_name}"

But you could write simpler as:

package_path=$root_dir/$py_version/$system/$package_name

That is, the double-quoting is not necessary in variable assignments, only in command line arguments.

This is fine:

for platform in 'osx-64' 'linux-32' 'linux-64' 'win-32' 'win-64'

But you could write more concisely as:

for platform in osx-64 linux-{32,64} win-{32,64}
\$\endgroup\$
1
  • \$\begingroup\$ Thank you very much for the detailed answer! I will pay more attention when to quote my commands \$\endgroup\$
    – mcocdawc
    Commented Jun 24, 2017 at 13:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.