On 26/10/2017 12:50 PM, Bruce Hoff wrote:
I respectfully disagree that it's "fragile" to depend on a particular
version of a package. On the contrary I think it's the foundation of
making software stable.
In general that might be true, but for R it's not. If mypackage
requires version 1.7.0 of yourpackage, and you release 1.7.1, suddenly
lots of people will have trouble installing mine, because although CRAN
will keep 1.7.0 around indefinitely, it won't keep binary builds of it
around. Lots of Windows and Mac users depend on CRAN to do the building
for them.
Having said this, reading the rest of your
description of how CRAN works is enlightening and emphasizes an
underlying philosophy about backwards compatibility. As you say:
> CRAN [requires] that any update to yourpackage doesn't break mypackage
So, returning to Shivaram's original question, the answer would be: You
need to write v 1.7.0 so that it is acceptable to anyone who currently
uses 1.6.2.
I oversimplified that a bit. CRAN doesn't absolutely require backwards
compatibility, they just discourage incompatibility by requiring you to
help your reverse dependencies cope with changes. If your update breaks
a revdep, you need to explain what you did to help the revdep author
cope with it, and it needs to be enough that CRAN agrees that package
author is being negligent by not adapting. Or something like that.
Duncan Murdoch
The patch (1.6.3) would be included in 1.7.0 along with
other changes you've made in the course of developing the package.
Those other changes should not negatively affect anyone currently
depending on 1.6.2. You then publish 1.7.0 to CRAN, for all (both those
who want the 1.6.3 patch and those who want the 1.7.0 new features) to
adopt. If you cannot make 1.7.0 acceptable to current 1.6.2 users, then
it has to be published as a different package ("yourpackage-2").
Thank you,
Bruce
On Thu, Oct 26, 2017 at 7:53 AM, Duncan Murdoch
<murdoch.dun...@gmail.com <mailto:murdoch.dun...@gmail.com>> wrote:
On 26/10/2017 10:36 AM, Bruce Hoff wrote:
Hi:
I think this would make life harder for CRAN and for other
developers,
so it's unlikely to happen.
For example, suppose both yourpackage 1.6.3 and 1.7.0 are
active on
CRAN, and mypackage declares that it depends on
yourpackage. Then if I
upload an update to mypackage, which version of yourpackage
does CRAN
install when testing my update? It would have to test both.
Respectfully, I don't see why this would be a problem for the
author of
'mypackage'. The author of 'mypackage' is simply one of
Shivaram's users
(a consumer of 'yourpackage'). He/she decides whether to depend
on v 1.6.3
*or* v 1.7.0 then builds, tests and publishes the appropriate
revision of
'mypackage'.
You could do that, but it would be very unusual (and fragile) to
have your package depend on a particular version of another
package. The more common thing is to say "Depends: yourpackage"
(or "Imports:", etc.), with no version dependency. Users installing
mypackage would need to have some version of yourpackage installed,
but R would be happy with either one.
When there's only one active version of yourpackage, CRAN enforces
quality by requiring that any update to yourpackage doesn't break
mypackage (and the other reverse dependencies), and that any update
to mypackage works with the latest yourpackage. That's already a
lot of work. When I was testing for CRAN, a few packages required
10 or 20 hours of testing when they submitted an update.
The problem arises if both versions of yourpackage are on CRAN with
equal status. Then CRAN shouldn't accept mypackage unless it works
fine with both, but that's twice as much testing. And in the
extended version with n packages having m active versions, it's m^n
times as much testing.
Duncan Murdoch
The author of 'mypackage' is free to move up to 1.7.0 when
he/she sees fit, e.g., based on what additional functionality is
included
in 1.7.0.
Also, it doesn't seem too bad for CRAN to only allow monotonic
increases in
version numbers. I would hope that Shivaram's series of
revisions are
backwards compatible and that the 'patch' included in 1.6.3 is also
included in 1.7.0. So he should be able to publish 1.7.0 to
CRAN and ask
his users to update to that version to get the patch. There
should be no
downside of having the other changes to 'yourpackage'. If, on
the other
hand, 'yourpackage' has changed from 1.6 to 1.7 so much that it
computes
different results, then perhaps it should be published under a
different
package name ('yourpackage-2'). In that case CRAN should allow both
packages to exist side-by-side in the repository.
Cheers,
Bruce
Date: Wed, 25 Oct 2017 16:45:22 -0400
From: Duncan Murdoch <murdoch.dun...@gmail.com
<mailto:murdoch.dun...@gmail.com>>
To: Shivaram Venkataraman <shivaram.venkatara...@gmail.com
<mailto:shivaram.venkatara...@gmail.com>>, Ben
Bolker <bbol...@gmail.com <mailto:bbol...@gmail.com>>
Cc: r-package-devel@r-project.org
<mailto:r-package-devel@r-project.org>
Subject: Re: [R-pkg-devel] Semantic versioning and maintenance
releases
Message-ID: <d090ebf0-8c42-99b5-58ca-355ebb25b...@gmail.com
<mailto:d090ebf0-8c42-99b5-58ca-355ebb25b...@gmail.com>>
Content-Type: text/plain; charset=utf-8; format=flowed
On 25/10/2017 4:28 PM, Shivaram Venkataraman wrote:
Thanks for all the replies. I can see that the monotonic
ordering is
in-built to support the latest / best version model that
CRAN has. That
said it would be great if the policy could be relaxed to
allow uploading
older versions which don't necessarily become the "best"
version.
Then we could ask users to use versions[1] and run something
like do
`install.versions('mypackage', '1.6.3')` if they really want
to be in the
1.6.x series.
I think this would make life harder for CRAN and for other
developers,
so it's unlikely to happen.
For example, suppose both yourpackage 1.6.3 and 1.7.0 are active on
CRAN, and mypackage declares that it depends on yourpackage.
Then if I
upload an update to mypackage, which version of yourpackage does
CRAN
install when testing my update? It would have to test both.
And if mypackage depended on herpackage and hispackage that also had
multiple active versions on CRAN, things would become unwieldy
very quickly.
Duncan Murdoch
Thanks
Shivaram
[1] https://github.com/goldingn/versions
<https://github.com/goldingn/versions>
On Wed, Oct 25, 2017 at 1:05 PM, Ben Bolker
<bbol...@gmail.com <mailto:bbol...@gmail.com>> wrote:
On 17-10-25 03:47 PM, Duncan Murdoch wrote:
On 25/10/2017 2:23 PM, Shivaram Venkataraman wrote:
Hello
We have an R package that uses semantic
versioning -- i.e. version
numbers
are of the form major_version.minor_version.pa
<http://major_version.minor_version.pa>tch_version
One of the ways we use the patch_versions is to
make maintenance
releases
or security fixes that users can apply without
worrying about any
functionality changes. For example if our users
were on 1.6.2 it is
often
easier for them to upgrade to 1.6.3 which has a
security fix rather
than
1.7.0
On the other hand our development continues
towards the next minor
version
and we sometimes have cases where say 1.6.3 is
released after 1.7.0.
While running `R CMD check --as-cran` for
version 1.6.3 we find that
this
leads to a warning which looks like
'Insufficient package version
(submitted:
1.6.3, existing: 1.7.0)'.
Our question is whether it is okay to upload
these maintenance
releases to
CRAN and if there is some way we can mark that
the version numbers
follow
semantic versioning.
CRAN won't accept 1.6.3 after 1.7.0 has been
published there. It
requires version numbers to be increasing. There's
no provision for the
scheme you're following.
Even if there were, it's not easy for a user to ask
to install any
version but the latest one. They'd need to work out
the URL and
download the tarball and build it from source.
install.packages() has
no provision for handling this automatically.
If an older version *were* on CRAN (I understand
why this isn't
feasible), devtools::install_version() would take care
of some of the
fussy bits (although it still requires having the build
tools installed).
You can use the 'ref' argument in
devtools::install_github to point
your users to a tag/release number ...
I'd suggest that you put the patch releases for
older versions on Github
or some other repository, and explain how users can
install directly
from there.
Duncan Murdoch
______________________________________________
R-package-devel@r-project.org
<mailto:R-package-devel@r-project.org> mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel
<https://stat.ethz.ch/mailman/listinfo/r-package-devel>
______________________________________________
R-package-devel@r-project.org
<mailto:R-package-devel@r-project.org> mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel
<https://stat.ethz.ch/mailman/listinfo/r-package-devel>
[[alternative HTML version deleted]]
______________________________________________
R-package-devel@r-project.org
<mailto:R-package-devel@r-project.org> mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel
<https://stat.ethz.ch/mailman/listinfo/r-package-devel>
[[alternative HTML version deleted]]
______________________________________________
R-package-devel@r-project.org
<mailto:R-package-devel@r-project.org> mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel
<https://stat.ethz.ch/mailman/listinfo/r-package-devel>
______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel