The main question that raises here is: Where are the limits?

As soon as we allow more than one design pattern for sharing code between
packages, we might have one more approach for code sharing every 6 months
making maintenance of different packages have a bigger learning curve for
no/little gain.

I'm OK with versionedDerivation, if we come to consensus it's better than
current approach and someone ports current codebase to use
versionedDerivation.

TL;DR: having more than one way to share code between packages gives more
burden to maintenance than it does actually to improve packaging.




On Mon, Apr 7, 2014 at 7:25 PM, Michael Raskin <7c6f4...@mail.ru> wrote:

>
> For me versionDerivation looks like a nicer solution, but I generally
> tend to be OK with computations written in Nix.
>
> I have been burnt by pythonPackages and even by linuxPackages providing
> different subsets of modules for different core versions… so I do not
> think versionedDerivation is worse than status quo.
>
> Given that dependencies are hidden from all-packages.nix now, I think
> that versionedDerivation + full set of suffixed versions in
> all-packages.nix make it obvious both for those reading the default.nix
> and for those reading all-packages.nix which versions could work.
>
> >discussing versionedDerivation - arguments
> >==========================================
> >
> >In https://github.com/NixOS/nixpkgs/issues/1957 Eelco Dolstra described
> >what he "dislikes":
> >
> >    == QUOTE
> >      My main objection to versionedDerivation is the wackiness of
> >      having package functions that take the version as an argument,
> >      i.e.
> >
> >      { stdenv, fetchurl, version ? "5.3" }:
> >      versionedDerivation "cups" version { ... }
> >      There is nothing about the function interface that tells you what
> >      the valid values of version are, and thus what versions are
> >      supported. What you should do is return an attribute set
> >      containing the supported versions:
> >
> >      { stdenv, fetchurl }:
> >      {
> >        php_5_3 = ...;
> >        php_5_4 = ...;
> >      }
> >      Of course, you can factor out the commonality between versions any
> way you want, e.g.
> >
> >      let
> >        makePHP = common: stdenv.mkDerivation ({ ... } // common);
> >      in {
> >        php_5_3 = makePHP {
> >          name = "php-5.3.50";
> >          src = fetchurl { ... };
> >        }
> >        ...
> >      }
> >      Alternatively, you can have separate files for each expression
> >      that include a file common.nix for the common stuff (like we do
> >      for the Linux kernel).
> >
> >    == QUOTE END
> >
> >  I agree that it does make sense to "docmuent" which versions are
> >  "supported".
> >  The easy answer is:
> >  The default version is documented in the argument list, the others
> >  just mean "can be build - or there has been a time where it did build"
> >  unless they get referenced somewhere (most likely in all-packages.nix,
> >  see php5_3fpm example above. Whether this should be documented this way
> >  is another story.
> >  => I've created a new page:
> https://nixos.org/w/index.php?title=Open_issues:maintenance_properties_of_a_package&action=submit
> >
> >  Documenting wich packages are how well supported is an open issue
> >  IMHO. This just is "yet another way".
> >
> >  The pattern Eelco Dolstra is discussing is used in different context
> >  and with some varation, eg in python-packages.nix:
> >
> >  python-packages.nix takes as arguments:
> >
> >    { pkgs, python, lowPrio }:
> >
> >  Thus while its not taking a version, you still have no idea which
> >  python you may pass (or python versions ..) - thus IMHO its not that
> >  much differing :)
> >
> >  A similar argument could be applied to "systems". (eg darwin vs
> >  x86_64 i686):
> >  php."5.3"."darwin" to indicate its fine to be used on darwin.
> >
> >  From this point of view there is not that much wrong by
> >  versionedDerivation, the only change neccessary would be making it
> >  return all versions as attrs so that such usage would be valid:
> >
> >    phps =    import ....php/default.nix;
> >    php_5_3 = import ....php/default.nix { }."5.3.x";
> >    php_5_4 = import ....php/default.nix { }."5.4.x";
> >
> >  Thus does it differ that much from [Example 3] above which looks like
> >  this:
> >
> >    php5_3fpm = php5_3.override { sapi = "fpm"; version = "5.3.x"; };
> >
> >  How would the "perfect PHP nixpkgs implementation" look like?
> >
> >    let commonConfigureFlagDescription = [ long list .. ];
> >
> >    let phpDerivation = { commonConfigureFlagDescription, version,
> >      src_md5_hash, patches ? [], allowFastCGI }: {
> >        // the common code merging the options
> >      }
> >
> >    mergexdebuglikestuff = php: php // {
> >      xdebug = ..
> >      acp = ..
> >      ... = ..;
> >    }
> >
> >    phps = {
> >      php5_2 = mergexdebuglikestuff (phpDerivation {
> >        long list of options
> >      });
> >      php5_3 = mergexdebuglikestuff (phpDerivation {
> >      });
> >      php5_4 = mergexdebuglikestuff (phpDerivation {
> >      });
> >      php5_5 = mergexdebuglikestuff (phpDerivation {
> >      });
> >    }
> >
> >   In the end is it that much more readable than what I already have?
> >   Link -> [Example 3] PHP above
> >
> >   I totally agree that I should refactor if newer versions happen to be
> >   totally different - it just didn't happen that way (yet) could be
> >   cause I've been lucky though.
> >
> >Can you reply if you have new arguments about why versionedDeravation
> >is nice/bad so that we get a comprehensive list and that I understand
> >which is the best way to rewrite those patches ?
>
>
>
> _______________________________________________
> nix-dev mailing list
> nix-dev@lists.science.uu.nl
> http://lists.science.uu.nl/mailman/listinfo/nix-dev
>
_______________________________________________
nix-dev mailing list
nix-dev@lists.science.uu.nl
http://lists.science.uu.nl/mailman/listinfo/nix-dev

Reply via email to