[prev in list] [next in list] [prev in thread] [next in thread] 

List:       macports-users
Subject:    Re: ruby_select is broken
From:       Ian Wadham <iandw.au () gmail ! com>
Date:       2021-10-10 20:13:02
Message-ID: C3EC7365-DEA9-47D3-9538-A96E7E92E5B1 () gmail ! com
[Download RAW message or body]

Thank you, Lenore.

> On 10 Oct 2021, at 1:45 am, Lenore Horner <LenoreHorner@sbcglobal.net> wrote:
> 
> It looks to me like the actual problem is that ruby30 doesn't produce any notes about how to \
> use port select unlike the pythonxx installations.  I've filed a trac ticket about adding a \
> note to ruby so that other people won't have Ian's problem. Lenore
> 
> > On Oct 8, 2021, at 22:20, Ian Wadham <iandw.au@gmail.com> wrote:
> > 
> > Hi Ryan and Bill,
> > 
> > Let's all stand back a bit and get a little perspective.
> > 
> > Firstly, the "sudo port select" command works fine, but it can take a while for a user to \
> > discover it when he/she needs it. 
> > A few weeks ago I read about a package called Flutter and its underlying language called \
> > Dart. They are supplied freely and openly by Google. Their libraries, tools, code fragments \
> > and language are claimed to make it possible to write GUI applications that can run on \
> > almost any device, using the same source code for every device. Flutter can be used on \
> > Linux and Windows to build apps for Android devices or for Windows/Linux desktops. It can \
> > be used on MacOS to build apps for iPhones, iPads and the MacOS desktop. I live Melbourne, \
> > Australia, a city that has just established a world record for days in COVID lockdown. So I \
> > was anxious to relieve the boredom by trying out Flutter and Dart. 
> > I have been a developer for many years and have many languages under my belt, but alas not \
> > Ruby. 
> > Flutter's pre-requisites on MacOS are Xcode 12 and CocoaPods. The latter depends on Ruby. I \
> > had to upgrade my MacOS from High Sierra to Catalina to get Xcode 12, which in itself was \
> > quite a drama, but I migrated MacPorts and my MacPorts apps without any trouble.  
> > The Getting Started page on CocoaPods' website says to use Ruby as provided by MacOS, using \
> > command "sudo gem install cocoapods". But that does not work and will never work again, \
> > because the MacOS version of Ruby is too old for building CocoaPods and is going to be \
> > phased out anyway in later versions of MacOS, as mentioned in the Catalina Release Notes. 
> > As noted above, I was a complete newcomer to Ruby (and still am). I did not wish to learn \
> > Ruby. I just wanted to install a more recent version of Ruby in order to build CocoaPods \
> > and then move on to Flutter and Dart programming, starting with (you guessed it) Hello \
> > World. 
> > When I installed the MacPorts package called "ruby" I got a version that was even more \
> > out-of-date than Apple's (1.8 versus 2.6). When I installed the MacPorts package called \
> > "ruby27" I got nothing I could run: no "gem" command down in /opt/local/bin, so I \
> > uninstalled ruby27 and went looking elsewhere for a Ruby installer (Google, Stack Overflow, \
> > Homebrew, RVM, rbenv), but always I had the nagging thought that surely MacPorts would not \
> > install a package and then have no way you could use it. I had of course never heard of and \
> > never used the "port select" command at that stage. Why would I have? Until recently I have \
> > been a C++ developer. 
> > Anyway I re-installed ruby27 and did a bit of digging around, finding that gem had been \
> > installed in /opt/local/bin as gem2.7, so I ran the command "gem2.7" and CocoaPods built \
> > and installed just fine. Then I wondered how does MacPorts handle other languages with \
> > multiple versions: I never had a problem a few years back when I downloaded a Python source \
> > program from the Internet and ran it, after using MacPorts to install Python. So I had a \
> > look at python_select's portfile and discovered the existence of the "port select" command. \
> > Even then it is not easy to find. There are about a dozen occurrences of the word "select" \
> > in the "man port" output and I was wondering for a moment if "port select" actually exists \
> > or if it is just some internal function of portfiles and MacPorts scripts. 
> > All of the above occupied several frustrating days of my time.
> > 
> > So this is why I say the portfile for ruby_select is broken. Several "ruby$NN" packages \
> > depend on it. 
> > MacPorts' Python gives a new user something he/she can immediately use, with a sensible \
> > default version being automatically "selected" (in the MacPorts sense), but MacPorts' Ruby \
> > does not do any of that. So it fails on the grounds of user UN-friendliness. At the very \
> > least MacPorts' Ruby installations should have a Note to inform any new users about the \
> > "port select" command. 
> > All's well that ends well. I am now getting up to speed on Flutter and Dart and have run \
> > the demo source code on my MacBook desktop and on an Xcode Simulator of my iPhone. I am \
> > also progressing well on porting one of my C++ apps to Flutter and Dart. 
> > All the best,
> > Ian Wadham.
> > 
> > > On 6 Oct 2021, at 8:54 am, Ryan Schmidt <ryandesign@macports.org> wrote:
> > > On Oct 3, 2021, at 02:58, Ian Wadham wrote:
> > > > On 2 Oct 2021, at 6:29 pm, Ryan Schmidt wrote:
> > > > > On Sep 25, 2021, at 23:14, Ian Wadham wrote:
> > > > > 
> > > > > > MacPorts contains packages of many versions of Ruby, similarly to the Python and \
> > > > > > Perl groups, but the corresponding "ruby_select" port does not automatically create \
> > > > > > the links needed to access commands "ruby", "gem" etc. I was able to get around \
> > > > > > this by using "sudo port select" manually, but would it be possible for someone to \
> > > > > > fix "ruby_select" so that the ports "ruby$n" work properly "out of the box".
> > > > > 
> > > > > I don't understand what you mean. ruby_select (and all _select ports) are helper \
> > > > > infrastructure so that "port select" works. Using "port select" is not a workaround; \
> > > > > it is *the* way to select a particular version of a set of ports.
> > > > 
> > > > The helper infrastructure is failing for ports "ruby$NN". Other ports which have \
> > > > multiple versions available have lines like: 
> > > > platform darwin 14 {
> > > > post-destroot {
> > > > select::install perl ${filespath}/perl5.16-apple.14
> > > > select::install perl ${filespath}/perl5.18-apple.14
> > > > }
> > > > }
> > > 
> > > These lines are from the perl_select port. I'm surprised to discover that we still have \
> > > such a port, since the perl ports in MacPorts are unique and do not participate in the \
> > > "port select" mechanism. The perl ports predate the select mechanism and switching them \
> > > to use that mechanism would cause lots of breakage. (A zillion ports depend on the \
> > > existence of an executable (or symlink) called "perl" in the path and expect the perl5 \
> > > port to provide it. If we remove the perl5 port and instead allow the select mechanism to \
> > > be responsible for providing the perl executable (symlink) then ports could not depend on \
> > > it. Ports are not permitted to rely on the effects of the select mechanism because the \
> > > select mechanism is intended for the use of users, not for the use of other ports.) 
> > > See https://trac.macports.org/ticket/29763 and https://trac.macports.org/ticket/60812.
> > > 
> > > Since the perl_select port has never worked correctly, anything done by the perl_select \
> > > port should not be construed as an example of how the select mechanism does or should \
> > > work. To avoid confusion, perl_select should probably be removed since nobody has fixed \
> > > it over the past decade. 
> > > 
> > > > or
> > > > 
> > > > foreach python $apple_pythons {
> > > > select.entries-append [list python {*}$python]
> > > > }
> > > > 
> > > > in their *_select portfiles. Presumably these automate the redirecting of commands such \
> > > > as "perl' or "python" to the appropriate version.
> > > 
> > > The select mechanism allows the user to select which version of a collection of ports \
> > > they want to use when they type the unversioned command(s). For example, the python39 \
> > > port installs /opt/local/bin/python3.9. If the user just types "python", they get \
> > > /usr/bin/python. Maybe the user wanted "python" to give them /opt/local/bin/python3.9. If \
> > > so, they would run "sudo port select python python39" which will create a symlink \
> > > /opt/local/bin/python pointing to /opt/local/bin/python3.9. (There may be many other \
> > > supporting files that get symlinked as well.) 
> > > The python select mechanism also allows the user to indicate that they would like to \
> > > create symlinks to whatever version(s) of python may be included in their version of \
> > > macOS. For example, "sudo port select python python27-apple" creates a symlink at \
> > > /opt/local/bin/python pointing to /usr/bin/python2.7 if the user's version of macOS has \
> > > /usr/bin/python2.7. 
> > > The port select mechanism never selects anything automatically*. It is always at the \
> > > discretion of the user whether they would like to select something, and they do that by \
> > > running "sudo port select ..." 
> > > 
> > > * with the exception of the "root" ports which have been designed incorrectly; see \
> > > https://trac.macports.org/ticket/49752 
> > > 
> > > > The ruby_select portile just has:
> > > > 
> > > > destroot {
> > > > select::install ruby ${filespath}/base
> > > > select::install ruby ${filespath}/none
> > > > }
> > > > 
> > > > which does not redirect the commands "ruby" or "gem" to the appropriate version when \
> > > > you have installed the port "ruby27" for example. Instead, "which ruby" or "which gem" \
> > > > always finds the Apple version of Ruby, which is now deprecated according to the \
> > > > Catalina Release Notes... 
> > > > Actually my first "workaround" was to use a Bash alias, but then I figured there must \
> > > > be a MacPorts command to fix it, perhaps called "port select"… :-)
> > > 
> > > 
> > > > In any event, the portile for ruby_select is not working on ports like "ruby26", \
> > > > "ruby27", etc.
> > > 
> > > So "sudo port select ruby ruby26" does not work for you? "sudo port select ruby ruby27" \
> > > does not work? What happens when you run them? If they do not create the expected \
> > > symlinks then indeed that is broken and you should file a bug report. But it worked for \
> > > me: 
> > > 
> > > $ sudo port select ruby ruby26
> > > Selecting 'ruby26' for 'ruby' succeeded. 'ruby26' is now active.
> > > $ ls - l /opt/local/bin/ruby
> > > lrwxr-xr-x  1 root  staff  22 Oct  5 16:38 /opt/local/bin/ruby -> /opt/local/bin/ruby2.6
> > > 
> > > 
> > > 
> > > > > > Also, the port actually called "ruby" is very old (version 1.8.7) and "port notes \
> > > > > > ruby" deprecates it. Should it be removed from MacPorts?
> > > > > 
> > > > > If nobody needs it, I suppose it could be removed. Do you know that nobody needs it? \
> > > > > I don't know that. 
> > > > > > Or reincarnated as "ruby18", dropping "ruby186" as well?
> > > > > 
> > > > > If it ain't broke, don't fix it?
> > > > 
> > > > Port "ruby_select" is broken.
> > > > 
> > > > Port "ruby" wasted my time because it looked as though it would be the default one to \
> > > > install, but then at the end of installation it deprecated itself.
> > > 
> > > As far as I can determine, the ruby_select port works as intended.
> > > 
> > > "If it ain't broke, don't fix it" was in response to your suggestion to rename the "ruby" \
> > > port to "ruby18" and drop "ruby186". Yes ruby could be renamed to ruby18 and that would \
> > > be more consistent and it's probably a good idea since it would reduce confusion, but it \
> > > would probably be a lot of work to rename it and fix everything that depends on it, and \
> > > the end result assuming everything goes smoothly would be no difference for the user in \
> > > how the ports work. The port has a maintainer and is not marked as openmaintainer so any \
> > > changes must be approved by the maintainer; you could suggest it to them by filing a \
> > > ticket. If they agree with renaming it, they could do the rename, or you or anyone else \
> > > could put in the work and submit it as a pull request. 
> > > With regard to removing ruby186, it was created deliberately "for those who need it for \
> > > compatibility reasons"*. Granted that was in 2009 so I don't know if anybody still needs \
> > > it for compatibility reasons. If not, it could be removed, but there are references to it \
> > > in several other ports which should be removed at the same time. But again, having the \
> > > ruby186 port available isn't hurting anyone, whereas removing it could potentially break \
> > > things if someone does need it. 
> > > * https://github.com/macports/macports-ports/commit/f6a29d1e4f0349b8485073c4670451e399d4d5bb
> > >  
> > 
> 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic