Thank you, Lenore.

> On 10 Oct 2021, at 1:45 am, Lenore Horner <lenorehor...@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...@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 <ryandes...@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
>>> 
>> 
> 

Reply via email to