Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rez on PyPI #625

Conversation

mottosso
Copy link
Contributor

@mottosso mottosso commented Apr 30, 2019

Hi all,

Here's a version of Rez compatible with PyPI.

rezonpypi


Questions Answers
What's changed? Installation and upgrades has been made easier
At what cost? No embedded virtualenv
What can we do? Create your own virtualenv
How can I try it? pip install bleeding-rez

Try latest branch

$ pip install git+https://github.com/mottosso/bleeding-rez.git@feature/rez-on-pypi-part3 -U

All tests pass on both Windows and Linux (the PR includes an AppVeyor Windows environment for tests). See below for current minor obstacles.


Overview

I've approached this in stages, whereby you are welcome to merge either one or all.


Highlights

Ticked boxes mean I'm happy with it, but let me know if you aren't. Unticked means it's something we need to address.

  • PyPI Rez is now compatible with PyPI, and as proof and testing ground I've uploaded my fork under the name bleeding-rez, which is what you're seeing above. There's not much to say about it other than it works as you would expect. No tricks.
  • PyPI Auto-deploy Rez is automatically submitted to PyPI whenever a GitHub release (or tag) is made. Keeping PyPI in sync with GitHub
  • Windows tests I've replaced Travis with AppVeyor; you shouldn't notice any difference, apart from tests now also running on Windows. Travis is still there for the time being, to make you comfortable with the switch.
  • Windows tests On-top of that, I noticed some tests hadn't been run on Windows before and fixed those. I suspect it was related to how some tests would silently fail (a.k.a. get skipped) if certain binaries wasn't found on the PATH. The problem was, the way binaries was discovered on Windows made it impossible to find cmake, and thus cmake tests were never run. I did however run into the following issue..
  • Visual Studio on Windows As a side-effect of addressing tests on Windows, I found that vcvarsall.bat doesn't work with the way the cmd shell is implemented; cmd is inheriting PATH from the system registry, whereas Visual Studio assumes PATH is appended interactively. As a consequence of this, it does mean Rez now inherits PATH more generally, which may or may not be what we want. See 1
  • Code Coverage In addition to Windows tests, I've also added code coverage, to get some sense of (1) what is left untested and (2) what is left actually unused and can be stripped.
  • system.is_production_install is no more This problem may be better addressed in another way, see 2
  • sup_world test disabled I couldn't figure out how to address this; somehow, the CMAKE_MODULE_PATH got appended with a Windows-backslash which threw cmake. See commit message for details.
  • --target Custom install directory with --target doesn't work with how Rez manages your PYTHONPATH. Because if you do use --target you would also need to manually add Rez to your PYTHONPATH but you can't, since rez env will take control of that PYTHONPATH and remove it once you've entered into an environment. Without --target, rez will still be accessible as site-packages is accessible despite not being on your PYTHONPATH. Workaround:
    1. Use a virtualenv
    2. Add destination folder to your system PYTHONPATH

No Virtual Envrionment

From what I can tell, the embedded virtualenv was used to let packages gain absolute control over PYTHONPATH, whilst still being able to expose the rez Python package to rez env.

Now that there is no virtual environment, rez is made available via the site-packages of the target Python install.

$ c:\python27\lib\site-packages\rez

But that means you can't install Rez elsewhere anymore, which can be a problem if you host Rez itself as a package.

To solve that, you can either can install any PyPI package in a virtualenv, including this Rez from this PR.


Is Production Install

Previously, a file called .is_production_install was embedded in the Scripts\rez directory alongside the Rez binaries. I was placed there to help identify the install having been made via install.py, which in turn was designed to solve the aforementioned issue of PATH.

With this PR, that safety guard is off per default, and replaced with using your own virtual environment.

$ python -m virtualenv my_rez_env
$ my_rez_env\scripts\activate
(my_rez_env) $ pip install bleeding-rez

The advantage is two-fold.

  1. Rez on Pip, improve adoption and reduce learning curve
  2. Simplified getting-started process for new users

I'd imagine the README would then be split between a "I just want to take Rez for a spin" and "I like Rez, now I want to use it in my large corp", whereby the latter involves a virtual env.


Post-merge

In order to test deployment, I've deployed to my account under a different name and version.

Once merged, you'll need to:

  1. Create an account on AppVeyor
  2. Replace my username and password in appveyor.yml
  3. Create an account on CodeCov
  4. Add your CODECOV_TOKEN to AppVeyor's Environment

Let me know your thoughts!

Edit: This also closes #339

mottosso added 20 commits April 27, 2019 11:41
For working on a fork, like bleeding-rez
Replaced nasty method of fetching PATH from system-wide state, rather than current shell. This doesn't let vcvars.bat do its magic on Windows. More here: AcademySoftwareFoundation@7f45429#r33332549
This currently does not build on Windows, and I can't for the life of me figure out how to fix it. Somewhere, The CMAKE_MODULE_PATH is being populated with a path containing backslash. See error below.

CMake Error at C:/Users/manima/AppData/Local/Temp/rez_selftest_o3kxx5/src/packages/sup_world/3.8/build/CMakeFiles/CMakeTmp/CMakeLists.txt:2 (set):
  Syntax error in cmake code at

    C:/Users/manima/AppData/Local/Temp/rez_selftest_o3kxx5/src/packages/sup_world/3.8/build/CMakeFiles/CMakeTmp/CMakeLists.txt:2

  when parsing string

    c:/users/manima/dropbox/dev/anima/rez/lib/site-packages/rez-2.29.1-py2.7.egg/rezplugins/build_system/cmake_files;c:\users\manima\appdata\local\temp\rez_selftest_o3kxx5\packages\translate_lib\2.2.0/cmake

  Invalid character escape '\u'.

CMake Error at C:/Program Files/CMake/share/cmake-3.13/Modules/CMakeTestCCompiler.cmake:37 (try_compile):
  Failed to configure test project build system.

-- Configuring incomplete, errors occurred!
# Conflicts:
#	src/rezplugins/package_repository/filesystem.py
This adds support for hosting Rez in a virtualenv
This reverts commit a164b75.

# Conflicts:
#	src/rezplugins/shell/cmd.py
On Windows, which didn't always find rez, not sure why
@mottosso
Copy link
Contributor Author

Help!

I'm having trouble solving the unticked boxes above, primarily the one involving CMake on Windows finding the Visual Studio install.

rez selftest -s cmd
Not searching for unused variables given on the command line.
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error in CMakeLists.txt:
  The CMAKE_C_COMPILER:
    cl
  is not a full path and was not found in the PATH.
  To use the NMake generator with Visual C++, cmake must be run from a shell
  that can use the compiler cl from the command line.  This environment is
  unable to invoke the cl compiler.  To fix this problem, run cmake from the
  Visual Studio Command Prompt (vcvarsall.bat).
  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.
CMake Error in CMakeLists.txt:

Any ideas? I suspect I need to add some CMake modules to enable it to find VS on the local disk, but I don't know how. :S

@bpabel
Copy link
Contributor

bpabel commented Apr 30, 2019

Having a working pip install would be great. Ditto for automated uploads.

I think we should still have an install script to create a virtualenv or standalone python installation. The poetry project has a good system that we may want to emulate. It's installable via pip, but they also provide a downloadable getpoetry.py script that installs poetry and it's dependencies into a virtualenv and updates the system path to make it runnable.

Also, Rez currently patches the generated console scripts to run with whatever python is in the environment (by default, setuptools bakes in the python executable path when building the script), not sure if we still want to do that or not.

@mottosso
Copy link
Contributor Author

I think we should still have an install script to create a virtualenv or standalone python installation.

There could still be, but frankly, I think that's better suited for the README.


Installation

Choose your installation method.

Simple

Simple The simple approach is well suited for beginners and those looking to learn more about Rez and whether it is suited to their problem and environment.

$ pip install rez

Advantages

  • User-friendly and familiar installation method Everybody loves pip
Recommended

Recommended The recommended approach is better suited for live production, where you've committed to Rez and want precision and control.

$ python -m virtualenv rez
$ rez\Scripts\activate
(rez) $ pip install rez

Advantages

  • Isolated PATH No interference from external binaries in your Scripts/ Python directory.
  • Isolated site-packages No interference from system-wide Python packages

@@ -58,6 +59,13 @@ def get_syspaths(cls):
if path not in paths:
paths.append(path)
cls.syspaths = [x for x in paths if x]

# add Rez binaries
exe = which("rez")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will fail under OSX. OSX has already something called rez, see https://www.unix.com/man-page/osx/1/Rez/. I've never been able to use the rez-commands without - because of that thing.

[wrk645d:~] jcmorin% which rez
/usr/bin/rez
[wrk645d:~] jcmorin% rez --help
### /Library/Developer/CommandLineTools/usr/bin/Rez - The option --help is not yet implemented.
### /Library/Developer/CommandLineTools/usr/bin/Rez - Usage: /Library/Developer/CommandLineTools/usr/bin/Rez [-a] [-al word | longword] [-arch arch] [-c creator] [-d name[=value]] [-i path] [-isysroot path] [-F framework] [-m] [-noResolve [output | include]] [-o file] [-ov] [-p] [-rd] [-ro] [-s path] [-sc script] [-t type] [-u name] [-useDF] [file...].

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @JeanChristopheMorinPerso, fixed.

@JeanChristopheMorinRodeoFX
Copy link
Contributor

We definitely need to keep the install.py for now (and same for the patched scripts), until we revisit the entire install process IMO.

@nerdvegas
Copy link
Contributor

nerdvegas commented Jun 5, 2019 via email

@nerdvegas
Copy link
Contributor

So I've just run a really simple test, and have verified that the issue we hit several years ago is still there. That is, PYTHONPATH is still used in a virtualenv, and takes precedence over any packages installed into the venv itself. It's very easy to break a binary within a virtualenv like this.

I used this sample project: https://github.com/pypa/sampleproject. Then:

  1. create a virtualenv
  2. use that venv's python to python setup.py bdist_wheel to create the sampleproject whl
  3. install the whl with the venv's pip
  4. test it by running the 'sample' binary in the venv (it works)
  5. create a temp dir, with 'sample' subdir and empty init.py within
  6. export PYTHONPATH=(this temp dir)
  7. Run 4 again. It explodes.

I installed via wheel because that removes the setuptools dependency in the 'sample' binary (one less thing to worry about).

So in any case, this doesn't work. I do have an idea now though - it might be enough to have the rez entry points do this:

  1. if _REZ_PATCHED_ENV envvar is defined, run as normal. ELSE:
  2. exec a proc (replace existing) with same sys args, but in environ with PYTHONPATH removed, and _REZ_PATCHED_ENV set.

Will try this out soon.
A

@bpabel
Copy link
Contributor

bpabel commented Jun 10, 2019

Using those steps, can confirm the same error happens on windows and mac.

Another possible idea. You can run the python executable with the -E flag to ignore the PYTHONPATH and other env var settings. Maybe it's possible to patch the entry points executable to include that flag?

@JeanChristopheMorinRodeoFX
Copy link
Contributor

The installer was also adding -E to the script's shebang (see https://github.com/nerdvegas/rez/blob/master/install.py#L80).

I don't know if it's possible to customize the entry point scripts without adding custom code as we do in the installer right now... But here is the doc (https://distlib.readthedocs.io/en/latest/tutorial.html#specifying-scripts-to-install) in case it can help.

@bpabel
Copy link
Contributor

bpabel commented Jun 10, 2019

The installer was also adding -E to the script's shebang

Doh! Of course, should have checked there first.

It looks like setuptools supports adding post-install scripts

Perhaps just moving the patching code from install.py into setup.py as a post-install routine? I haven't used that feature before though. Will have to check how it works when generating wheels.

@nerdvegas
Copy link
Contributor

Yes, getting the -E in there is the reason we have patched distlib/virtualenv in the first place.

Correct me if I'm wrong but I believe that patching the executables in a post-install routine would be problematic on windows, since these are .exes at that point (rather than a simple shebanged script as per linux).

I was thinking about this some more, and I'd like to try out the re-exec idea I mentioned earlier, but only where PYTHONPATH is non-empty. That may do the trick, not sure.

On a related note, I recall why we have those embedded dependencies now (vendor/ dir) - or at least, a major reason why. It's because it is a common need to install rez as a rez package - but if rez had external dependencies, then those would also have to be installed as rez packages. To do this would mean either rez itself being able to install packages and their dependencies (which it cannot do yet, for a multitude of reasons, which I want to go over in the roadmap); or, we would have to ensure that rez-pip worked to the extent needed to do this - and that's another complex piece of code that then becomes a potential barrier to installing the rez rez package. Also, at the time, rez-pip did not exist.

@JeanChristopheMorinRodeoFX
Copy link
Contributor

Correct me if I'm wrong but I believe that patching the executables in a post-install routine would be problematic on windows, since these are .exes at that point (rather than a simple shebanged script as per linux).

Technically, if I understand things correctly, distlib supports Windows for this. At least there is no warning about Windows in there doc for the shebang. I would guess they do some dark magic (I don't know much about Windows, so everything is dark magic to me 😛 ) ... To be verified I guess.

I was thinking about this some more, and I'd like to try out the re-exec idea I mentioned earlier, but only where PYTHONPATH is non-empty. That may do the trick, not sure.

From what I know, exec caused us a lot of headaches in the past and we've put some rules where nobody can use them. If I remember correctly, processes that were spawned with exec where losing their parent or something, and then if the process was killed, the exec'ed process would become detached and the process was never really killed. Or something like that. So for RodeoFX, if we can avoid exec, that would be great. No idea if you guys had problems in the past with this sort of things.

As for the vendored dependencies, I was looking at still having them, but not as we have right now. The archive that we provide (wheel or whatever the format is) would contain the vendored dependencies, but they wouldn't be in git. I'll open an issue so we can discuss future avenues? What do you think?

@nerdvegas
Copy link
Contributor

nerdvegas commented Jun 10, 2019 via email

@nerdvegas
Copy link
Contributor

So I've done some testing using execve + unsetting PYTHONPATH from environ, and it seems to work so far. JC, I know you said you've had issues with exec, any chance you could find out more? Otherwise I'll go ahead with it anyway and if there are issues we'll find out. At that point it shouldn't be hard to switch to a subprocess.

Right now I'm thinking it shouldn't be too hard to put together another PR drawing from this one, but implementing this exec fix and keeping compatibility with the current installer. Then we can put it through some real studio testing and see what breaks.

Ps - other evars that can affect rez/python need to be unset also - eg LD_LIBRARY_PATH and LD_PRELOAD. What this won't fix is if someone provides a shared lib on LD_LIBRARY_PATH that overrides one of python's own. I don't know if anyone out there has hit this situation. The libs in question are (Ub 16.04):

linux-vdso.so.1
libpthread.so.0
libc.so.6
libdl.so.2
libutil.so.1
libz.so.1
libm.so.6
/lib64/ld-linux-x86-64.so.2

@mottosso
Copy link
Contributor Author

Nice find, guys!

Right now I'm thinking it shouldn't be too hard to put together another PR drawing from this one

I'd be happy to implement this here? You can also push directly to this PR, as I've enabled maintainer push privileges.

@nerdvegas
Copy link
Contributor

Hey Marcus, no worries if you'd like to tackle it in this PR.

To expand a little on what I've been thinking:

  • install.py has a new --experimental arg
  • existing setup.py is moved to setup_old.py; new setup.py for pip goodness is added
  • install.py switches between the two depending on --experimental
  • the check venvs + execve is done in one place that every entry point hits, from memory I think this is rez/cli/_main.py:run?
  • we still need to think about what it means if everything in the venv/bin dir is visible on PATH. This might be ok if we ensure that its at the end of PATH in a rez-resolved env. Right now it's probably at the start, because the current bin/rez folder only contains the rez binaries. Bear in mind though that we could still hit roadblocks related to this, and it may be necessary to wrangle the venv a bit and create that rez subdir still.

@mottosso
Copy link
Contributor Author

mottosso commented Jun 12, 2019

Cool, having a look at this, and a few more ideas.

  1. Revert to using the scripts= argument, and provide .sh and .bat files, primed with python -E
  2. Since (1) isn't nice on Windows (i.e. WIP No more "Terminate Batch Job? (Y/N)" #626), have a look at Shimmy for making .exe
  3. Since (2) is based on Pip's shims which may then also include Shell history not working in cmd.exe or PowerShell #616, consider https://github.com/71/scoop-better-shimexe that addresses this problem
  4. Considering (3) is still rather complex and may require embedding an .exe itself into the repository (along with source), have a look at whether cscript can avoid the issue with (1). (Yes, Windows can run .js files natively as executables :gasp:)

Was there any issue with installing .sh scripts on Linux?

@nerdvegas
Copy link
Contributor

nerdvegas commented Jun 12, 2019 via email

@mottosso
Copy link
Contributor Author

Having a look at this, but not sure I'm doing it right.

I'd like to try out the re-exec idea I mentioned earlier, but only where PYTHONPATH is non-empty. That may do the trick, not sure.

Is this what you mean?

rez.exe/sh/bat

import os
import subprocess

# Clear PYTHONPATH
environ = os.environ.copy()
environ.pop("PYTHONPATH")

# Re-launch Rez with clean env
subprocess.Popen(["rez"], env=environ)

If so, then I'm not sure this solves the problem, because in order to get to this point in the Python script, you would first need to find it on the PYTHONPATH/site-packages, which is what the original problem was? E.g. your step (6) and (7) from the sampleproject example.

E.g.

$ mkdir rez  # fake rez
$ touch rez/__init__.py
$ export PYTHONPATH=$(pwd)
$ python -m rez  # Wrong Rez picked up

And if the wrong Rez is picked up, we couldn't run our code to re-exec a clean Rez. Let me know if I got this wrong somehow. You could also have meant to do this in a .sh or .bat script, in which case it might work, but would eliminate use of entry_points from setup() (which isn't necessarily a bad thing).

@nerdvegas
Copy link
Contributor

nerdvegas commented Jun 13, 2019 via email

@mottosso
Copy link
Contributor Author

Of course it is possible for someone to put a fake rez on PYTHONPATH and break it

Hold up, I thought this was the issue you were demonstrating with sampleproject? Of calling sample.exe when another sample/__init__.py was on the PYTHONPATH?

If you're OK with Rez clashing, then perhaps there's an even simpler method that doesn't involve more processes.

import sys
sys.path[:] = []

That way, regardless of what was on PYTHONPATH at boot is swept away. We could do this at the start of e.g. rez/cli/_main.py such that any subsequent import would see nothing but Python's lib/ directory (not even site-packages/).

While we're at it, we could clean up the environment too.

import os
os.environ.pop("PYTHONPATH", None)
os.environ["PATH"] = which("bash")  # on Linux
os.environ["PATH"] = which("cmd")  # on Windows

The bigger concern is that current version rez rez package won't work in combination with this new version.

You mean as it exists at the moment in this PR? Because this is how I'm using it here and haven't noticed any issues.

@nerdvegas
Copy link
Contributor

nerdvegas commented Jun 14, 2019 via email

@mottosso
Copy link
Contributor Author

mottosso commented Jun 14, 2019

Ok, I see what you mean.

For completeness, these are the unknowns that we're working with at the moment.

  • PYTHONPATH was causing issues in the past that I'm pretty sure weren't as simple as rez itself being involved
  • I'm not sure that's going to cover other cases such as LD_LIBRARY_PATH on linux.
  • I also doubt that altering os.environ would do anything for those cases.
  • JC had issues with exec (os.execve or subprocess.call("exec")?)

For pure-Python packages, editing environ and sys.path would have an effect on imported modules, but I think you're right that os.environ may not be what compiled modules are actually looking at, and that Python has an internal os.environ which we aren't able to edit as easily.

In either case, better safe than sorry; once we've got a working version covering the unknowns, we can start to peel away at them one at a time.

@nerdvegas
Copy link
Contributor

nerdvegas commented Jun 14, 2019 via email

Allow for unsafe environment from within a Rez context
@mottosso
Copy link
Contributor Author

mottosso commented Jun 17, 2019

Having a look at this with execve but it isn't looking good on Windows, which doesn't appear to actually replace the process, resulting in the calling shell acting as though the child Python has exited and starts accepting input at the same time.

Instead, I used subprocess.Popen despite then creating one more level deep in the process hierarchy.

To test out before/after, I also added REZ_UNSAFEMODE, where "unsafe" means allowing for PYTHONPATH to follow along into the context. Without it, this extra level of processes is created.

$ rez env  # pid 1000
> $ # pid 1001
> $ exit  # pid 1001 dies
# pid 1000 dies
$
$ export REZ_UNSAFEMODE=1
$ rez env  #pid 1000
> $ # still pid 1000

At least two things to improve here.

  1. Is there a way to avoid another level in the hierarchy? I attempted a "fire-and-forget" for Popen, whereby I just close the parent Python process, but like with execve it causes the parent shell to think it finished and start accepting input again which isn't great.
  2. Is there another way of getting the new Python to launch rez? At the moment, since PYTHONPATH is removed, I launched the subprocess in the parent directory of the rez Python package, leveraging Python's ability to pick up modules from the current working directory. It's relatively safe, so long as Rez doesn't reside amongst other packages (like it would if installing in a non-virtual environment), but means Rez loses hold of what it's actual current working directory is. Perhaps a better alternative is importing the module by absolute path, via e.g. importlib.find_module?

Despite that, it does work.

$ set PYTHONPATH=some/bad/path
$ rez env
> $ echo $PATH
> $

@nerdvegas
Copy link
Contributor

RE execve and REZ_UNSAFEMODE:

I fully expect there may be differences between platforms. For example, Linux may be fine with execve, and if so we should use it. I also think we may find ourselves in need of multiple settings that relate to this bootstrap-level stuff.

I have a suggestion: we should have one _REZ_BOOTSTRAP_CONFIG evar, which is a JSON-encoded dict. Also, for each platform, we have a hardcoded dict which contains the defaults for these settings. In _main, this dict is updated with anything from _REZ_BOOTSTRAP_CONFIG.

So for eg:

if platform.system.lower() == "linux":
    bootstrap_conf = {
        "use_execve": True,
        "inherit_pythonpath": False
    }
elif platform.system.lower() == "windows":
    bootstrap_conf = {
        "use_execve": False,
        "inherit_pythonpath": False
    }

This will avoid a bunch of extra evars if we find we need further control; it also gives us a nice analogy to the main config (which we can't use in this case, of course). It's a little technical to have to provide JSON, but in this case I think it's good - anyone changing this stuff should be fairly technical.

In terms of whether or not you can avoid the extra subproc on Windows, I have no idea :)

"""Is there another way of getting the new Python to launch rez"""

I would have thought you'd just be using the exact same sys.argv again? Presumably this would then just invoke the very same entry point again. Is there a reason you aren't doing this?

@mottosso
Copy link
Contributor Author

For example, Linux may be fine with execve, and if so we should use it

Oh, I would have thought you'd prefer consistency, despite platform. If subprocess works on Linux too, then why implement it twice? They're bound to have issues of their own. Are you sure?

I have a suggestion: we should have one _REZ_BOOTSTRAP_CONFIG evar

That's a good idea, once related variables start growing that's one way of handling it.

I would have thought you'd just be using the exact same sys.argv again? Presumably this would then just invoke the very same entry point again. Is there a reason you aren't doing this?

It does forward the arguments, but it needs to take into account the calling executable which isn't Python itself, but rather the compiled executable.

$ rez env  # print(sys.argv)
['C:\\Users\\marcus\\rez-virtualenv\\Scripts\\_rez\\rez.exe', 'env']

In the current commit, it's replacing rez.exe with python -m rez and forwards the rest.

@nerdvegas
Copy link
Contributor

nerdvegas commented Jun 18, 2019 via email

@nerdvegas nerdvegas mentioned this pull request Jul 12, 2019
@nerdvegas nerdvegas added the ON HOLD Awaiting other tasks, or kept for reference only label Jul 20, 2019
davidlatwe added a commit to davidlatwe/rez that referenced this pull request Mar 12, 2021
Now the setup.py is able to make binary scripts by itself and
install them as data_files under rez production dir 'bin/rez'
(or 'Scripts/rez' on Windows). However, console_scripts 'rez'
is conflicting with the rez production dir 'rez'.

Since the previous install.py already removing those scripts
before doing the *patch*, console_scripts should be ignored
in new setup.py.

See AcademySoftwareFoundation#625 and AcademySoftwareFoundation#662 for reason
why adding console_scripts in the first place.
@nerdvegas
Copy link
Contributor

Closing as we're already publishing to pypi via gh workflow now

@nerdvegas nerdvegas closed this Mar 19, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
installer ON HOLD Awaiting other tasks, or kept for reference only
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants