Why is having different versions of platforms a recipe for disaster?
-Terence
On 6/4/2014 4:29 PM, Brian LeRoux wrote:
As discussed: having different versions of platforms and plugins is a
recipe for disaster. The design choice of version locking is deliberate to
avoid that. I'm going to ignore the ramble about grunt, etc. I'm not
advocating for that nor am I interested in javascript build library
fashion. Those things are not problems we seek to solve here.
Also: this is not talk. Its building consensus to *continue* the work being
done into a direction that everyone feels good about. The alternative is
patchbombing and a massive delete of google employee commits which is
probably not productive.
On Wed, Jun 4, 2014 at 2:16 PM, Andrew Grieve <agri...@chromium.org> wrote:
Brian's and Carlos' examples have a very important difference:
Brian's: platforms are dependencies of CLI
Carlos': platforms are siblings of CLI in top-level package.json
With Carlos', the user can easily control versions of the platforms, which
is great. You could just as easily put plugins in there now that npm
supports multiple registries as well.
I don't think you'd need CLI at all with this setup. Just use plugman &
grunt & recreate your project on every build. I think it's a nice workflow,
but I'm afraid that dramatically changing out documented workflow again so
soon would be an unwelcome change. I also think it'd be a good amount of
work to make our tools smart enough to work alongside npm in a way that
isn't confusing (e.g. if we're recreating every time, we'll need to speed
it up a lot. If not, then you need to tell it when dependencies change).
My main goal for now is to get to where we can release platforms
independently, but I'm curious if this is all talk or is anyone intending
to do some real exploration in this area?
On Wed, Jun 4, 2014 at 4:55 PM, Brian LeRoux <b...@brian.io> wrote:
Here is an example using our current situation. Cordova is versioned [1]
and the CLI calls are abstracted as npm scripts [2]. If we change to the
proposed 'versioning platforms using npm' we don't have to download
platforms, cache them or perform any custom dependency logic.
We will then be well on the path to making the CLI *really* dumb and it
will only pass calls down to the lib installed in node_modules.
HTH
[1]
https://github.com/brianleroux/cordova-example-using-npm/blob/master/package.json#L13
[2]
https://github.com/brianleroux/cordova-example-using-npm/blob/master/package.json#L8
On Wed, Jun 4, 2014 at 1:38 PM, Carlos Santana <csantan...@gmail.com>
wrote:
Michal
The grunt plugin and yeoman generator I implemented a long ago. So
it's
implemented on top of what cordova provides.
I'm confuse, this is the point I was trying to get that there is "user
space" and "cordova platform space", Doing a plugin for yeoman, gulp ,
grunt, or the next thing is user space.
cordova as a platform should be using flexbile and clear on what is
doing,
so "user space" can customize on top of it.
On Wed, Jun 4, 2014 at 12:44 PM, Terence M. Bandoian <
tere...@tmbsw.com>
wrote:
This is helpful. Thank you for posting this, Carlos. I have a
couple
of
related questions.
The config files I've used iOS and Android are significantly
different
for
the same project. Is combining everything for all platforms into one
config.xml recommended?
What cordova commands cause the www folder to be copied to a
platforms
directory? My workflow for iOS/Xcode is typically (similar for
Android/Eclipse):
- add/build iOS platform using cordova
- edit, build, test iteratively in Xcode using platforms/ios
directory
Xcode doesn't copy from the outer www directory when it builds.
Should
it?
All of the files added to the Xcode project are in the platforms/ios
directory.
-Terence
On 6/4/2014 10:10 AM, Carlos Santana wrote:
I think regardless how much sugar we use to make it easy, I think
the
under
the hood foundation/architecture should be something like:
LocalProject/www/
LocalProject/config.xml
LocalProject/package.json
LocalProject/node_module/.bin/cordova
config.xml (manages the cordova app)
package.json (manages the cordova project)
pacakge.json (will specify all dependencies and npm will take care
of
fulfill them)
{
cordova: ">3.6",
cordova-ios: "3.6.1",
cordova-android: "3.6.2",
cordova-plugin-device: "*",
cordova-plugin-file: "^0.2.4"
}
npm install will take care of making everything available locally.
I know that we don't have plugins in npm, but something to think
about,
in
terms of just a secondary repository to download the files and
caching.
a global @cordova-cli, can be available like grunt-cli, to look
first
in
local directory (i.e. findup)
like someone mentioned npm installs hooks can run the "cordova
platform
add"
this way minimal set of files can be put a dev repo, and reproduce
by
another developer very easy both getting same resulting project.
git clone https://github.com/myuser/cordovapp && cd cordovapp &&
npm
install && cordova run android
On Tue, Jun 3, 2014 at 6:35 PM, Terence M. Bandoian <
tere...@tmbsw.com>
wrote:
I still consider myself a relative newcomer to Cordova but, from a
development standpoint, it would be easiest for me if I could
manage
each
platform of a project independently - including plugins. Creating
a
parallel project to make sure that the plugins and Cordova base
don't
change for one platform while I work on another isn't ideal but it
isn't
completely unmanageable either. It just makes the workflow a
little
more
complex.
-Terence
On 6/3/2014 7:12 PM, Michal Mocny wrote:
We don't do platform-plugin version matching *at all* today.
Everyone
uses
the latest plugins and any platform version they want, and its
been
"fine".
So using different platform versions isn't as hard as you guys
are
making
it out to be.
Still, I've already said its not necessarily a complexity that
needs
to
be
addressed in a world where you can create multiple projects and
use
--link-to or whatever, so long as your platforms aren't installed
globally.
Anyway, thanks for posting your instructions Brian/Tommy. As I
mentioned
it would be, thats a different workflow than we have now. I'm
going
to
sleep on it before I comment, but it certainly isn't just like
"You
know
how we do it today".
-Michal
On Tue, Jun 3, 2014 at 7:59 PM, tommy-carlos williams <
to...@devgeeks.org
wrote:
I don’t think you really can forget about plugins for a second.
In my personal opinion, the entire ./platforms folder should be a
build
artefact. If you want to freeze iOS, then use a branch or a new
clone
of
the project.
It’s not that I can think of no scenarios where supporting
multiple
platform versions would be needed, it’s just that I think it’s
needlessly
complex vs using a dev workflow to solve those problems.
I already version cordova within a project… I have a local
version
of
cordova installed into ./node_modules for each project and use
Grunt
to
call ./node_modules/.bin/cordova rather than the global cordova
cli.
On 4 June 2014 at 9:46:29, Terence M. Bandoian (
tere...@tmbsw.com)
wrote:
Forgetting about plugins for a second, what if:
- I complete a project for iOS
- six months later the client decides to port to Android and:
- I want the latest fixes for Android
- I want to keep the iOS version frozen for the time being
I would expect releases for each platform to be on different
schedules.
-Terence
On 6/3/2014 6:17 PM, Michal Mocny wrote:
Most plugins will work across a wide range of platform versions,
so
often
it would work to have disparate platform versions even with
plugins.
However, I do concede that in general this isn't a complexity we
focus
on.
Interested in your thoughts about the other points.
-Michal
On Tue, Jun 3, 2014 at 7:07 PM, tommy-carlos williams <
to...@devgeeks.org>
wrote:
You can’t have version x of a plugin for iOS and version y of
that
same
plugin for Android, so multiple platform versions seems like a
complexity
for complexity’s sake.
It’s true that different apps need to support different
platform
versions,
but I would suspect that the greatest majority of those would
want
the
same
version of iOS and Android in app x.
On 4 June 2014 at 9:04:42, Brian LeRoux (b...@brian.io) wrote:
That is the thing: you do not EVER want to have disparate
versions
of
platforms. Plugins negate this potential fantasy.
You want version locked deps. You want to use package.json to
do
that
b/c
that is what the runtime we use has standardized itself on.
On Tue, Jun 3, 2014 at 1:12 PM, Terence M. Bandoian <
tere...@tmbsw.com
wrote:
A typical use case might be:
-project1
-project1-ios
-project1-android
-project1-windows
...
-projectN
-projectN-ios
-projectN-android
-projectN-windows
with a different platform version for each sub-project.
Would CLI be installed globally? Locally for each sub-project?
Would a
project-platform have to be re-built if a plugin were added?
-Terence
On 6/3/2014 1:47 PM, Michal Mocny wrote:
Okay, so I think that implies:
(a) CLI versions tied to very specific platform versions ==>
to
switch
platform versions you must switching CLI versions ==>
switching
one
platform version switches all platform versions.
- Andrew pointed out this is currently the case, and is a
problem
that
leads to users not updating CLI as often as they otherwise
would
- I think this basically implies platforms cannot be
independently
versioned (sure the semver numbers may differ, but for all
practical
purposes, you would use platforms from the same release date,
based
on
CLI
version).
(b) Require apps to depend on specific CLI version, assuming
you
mean
with
a local package.json:
- Now all cordova projects must be node projects, which they
currently
are
not.
- Currently the cordova-cli creates apps, so we have a
globally
installed
bootstrapping cordova-cli, and a locally installed specific
version
cordova-cli, a-la grunt/gulp. (this idea was thrown around
before).
- Quite a dramatic change for cordova workflow, surely larger
than
the
current proposal.
- Or we drop cordova-cli entirely and just publish grunt/gulp
plugins
to
"add cordova" to your existing web app. Thats an even more
radical
departure and significant work.
-Michal
On Tue, Jun 3, 2014 at 1:58 PM, Brian LeRoux <b...@brian.io>
wrote:
No, at least not how I'd see it done.
1.) Updating is important. Staying current: encouraged.
2.) I'd make my App depend on a specific CLI version. I'd
call
into
that
using npm scripts.
On Tue, Jun 3, 2014 at 10:48 AM, Michal Mocny <
mmo...@chromium.org>
wrote:
Thinking it through, if cordova platforms are deps of the
CLI,
to
install a
specific version you wouldn't just do:
npm install -g cordova-ios@3.4.1
you would actually need to:
cd $(npm config get prefix)/lib/node_modules/cordova
npm install --save cordova-ios@3.4.1
..and then remember to do that again whenever you `npm
update
-g`
..and its harder to have multiple platform versions for
different
projects
(questionable if this is useful for devs outside of
cordova
contributors,
but may be useful at last test upgrades when we ship new
platform
versions).
-Michal
On Tue, Jun 3, 2014 at 1:28 PM, Brian LeRoux <b...@brian.io>
wrote:
NIH: not invented here
On Tue, Jun 3, 2014 at 10:17 AM, Andrew Grieve <
agri...@chromium.org
wrote:
On Tue, Jun 3, 2014 at 12:19 PM, Brian LeRoux <b...@brian.io>
wrote:
Actually that was >0 LOC which is a fine argument if you
ask
me.
And
we
both know there is much more to it than just that.
lazy_load…for
example.
If you're concerned about code, there is a tonne of much
lower-hanging
fruit.
Bundling platforms is bundling a dep that we require to
operate.
We
do
not
require plugins to operate. You cannot build a project
without
having a
platform and, indeed, you probably want more than one.
I don't require blackberry to create an iOS project. But
I
do
require
some
plugins. We use "npm cache add" to download plugins, I
don't
see
how
platforms would not work just as easily.
Agree that we need discreet versioning: hence why I'm
advocating
we
use
well understood, maintained, and effectively standard system
for
doing
this. We do not need NIH dependencies that is what
package.json is
for!
I don't know what NIH dependencies are. Googling
suggests
you're
talking
about drugs...
We *are* using npm for downloading, we're just not making
the
user
type
it
directly.
Mark's approach also avoids the "what-if" cases where
what's
in
your
node_modules might not match what's in your platforms/
Does what Mark has implemented not address a use-case of yours?
Or
are
we
going back & forth over personal preference?
On Tue, Jun 3, 2014 at 9:07 AM, Andrew Grieve <
agri...@chromium.org>
wrote:
On Tue, Jun 3, 2014 at 11:34 AM, Brian LeRoux <b...@brian.io
wrote:
Andrew, you misunderstand. I am talking about bundling
platforms
directly
as dependencies of the CLI.
A trivial example:
CLI
'-ios
Wherein, CLI declares the precise version of the
platform
it
uses.
We
could
wildcard. I don't know that we want or need to do that.
It would have identical semantics to today except the
download
penalty
happens up front. (We can remove lazy_load logic. We
don't
have
to
maintain
our own dependency manifests and caches. LESS code: good
thing.)
Let me paste the code for doing our own caching for
you:
cordova_npm: function lazy_load_npm(platform) {
if (!(platform in platforms)) {
return Q.reject(new Error('Cordova library "' +
platform
+
'"
not recognized.'));
}
var pkg = 'cordova-' + platform + '@' +
platforms[platform].version;
return Q.nfcall( npm.load, {cache:
path.join(util.libDirectory,
'npm_cache') })
.then(function() {
return Q.ninvoke(npm.commands, 'cache', ['add',
pkg]);
}).then(function(info) {
var pkgDir = path.resolve(npm.cache, info.name,
info.version,
'package');
return pkgDir;
});
},
There's really no "amount of code" argument here.
Adding platforms at a specific version would mean
having
a
specific
version
of the CLI. Yes: this is way better! Explicit
dependencies
is
the
best
way
to work w/ the small modules thing.
Bundling platforms with CLI would be like bundling all
of
the
plugins
with
CLI, or like bundling every npm module with npm.
Devs need to be able to try out platforms at different
versions.
We
should
not do anything that keeps users clinging to old versions
of
CLI
(e.g.
they
do this now because they don't want to update to new
platforms)
On Mon, Jun 2, 2014 at 7:34 PM, Michal Mocny <
mmo...@chromium.org>
wrote:
On Mon, Jun 2, 2014 at 10:14 PM, Andrew Grieve <
agri...@chromium.org
wrote:
Here's both flows as I understand them:
Direct NPM flow:
# Downloads platform source into node_modules
npm install cordova-ios@3.4.0 --save
# Runs the create script and installs plugins to
create
platforms/ios
cordova platform add ios
--path=node_modules/cordova-ios
To be fair, I think with Brian's suggestion, platform
add
FOO
would
by
default look in node_modules so you wouldn't be explicit
about
it,
and
also
the default cordova project package.json would depend
on
all
the
latest
versions of each platform, so the flows would actually
be:
cordova create Foo && cd Foo
npm install
npm install cordova-ios@3.4 --save
cordova platform add android
cordova platform add ios
# crazy idea? use npm post-install hooks to auto-run
create/upgrade
so
you usually don't need above two lines?
Compared to:
cordova create Foo && cd Foo
cordova platform add android
cordova platform add ios@3.4
I think #2 is enough better that its not worth
changing.
Cordova-to-npm flow (as Mark's implemented):
# Runs "npm cache add cordova-ios", then runs create
script
from
~/cache/cordova-ios/bin/create
cordova platform add ios@3.4.0
- In both flows: we use npm to do all of the heavy
lifting
- In both flows: the npm module is cached in your
home
directory
- In both flows?: we store the plugins & platforms
explicitly
within
config.xml (Gorkem's added this)
- In flow #1, we have a package.json & a node_modules, in
#2
we
don't.
Why put the onus on the user to fetch the platform source
when
it's
as
easy
as running "npm cache add" under-the-hood?
In regards to the idea of using require() on
platform
scripts
instead
of
subshelling: I think this is tangental to the debate of
how
to
fetch
the
platform.
In regards to using "npm install" directly when using
the
plugman
workflow:
Sounds good to me.
On Mon, Jun 2, 2014 at 6:05 PM, Brian LeRoux <
b...@brian.io>
wrote:
Eventually, yes. (Sort of how Grunt works now.)
On Mon, Jun 2, 2014 at 5:52 PM, Terence M. Bandoian <
tere...@tmbsw.com
wrote:
Can multiple versions of a platform be installed
side-by-side?
-Terence
On 6/2/2014 3:04 PM, Michal Mocny wrote:
>From original email: "Ideal future CLI uses
platforms
just
like
other
deps.
We lose lazy loading but network and disk is cheap so
it
wasn't
really
important anyhow."
Made me think Brian is proposing adding platforms to
cli
package.json
dependencies, and you would have a single global
install
cordova-platforms.
Then you can override the version with an explicit
install
as
he
mentions
"npm i cordova-ios@3.5.0".
Personally, I think that workflow could work, and
has
a
few
benefits,
but
I'm not sure that option compares well to the
alternative
of
just
lazy
loading using npm cache add as Mark has already
implemented
an
experiment
(anyone interested in this topic should take a look at
that
patch).
The steps Brian & Ian outline about how to package
platforms
for
release
to
npm are possibly an improvement over the old-style
platform-centric
workflow. Instead of downloading a tarball and
running
a
create
script,
you npm install and run a create() function, and that
can
more
easily
be
bundled into other build scripts/boilerplate. For
CLI
workflow,
not
sure
that there is any real difference (as Jesse says).
One
note,
though:
cordova-* platforms are templates for projects, so
the
package.json
of
the
npm package itself shouldn't end up inside projects
that
are
created
with
it. I think.
-Michal
On Mon, Jun 2, 2014 at 3:42 PM, Ian Clelland <
iclell...@chromium.org>
wrote:
There seems to be some confusion -- I think people
are
talking
about
different things here, but perhaps it's just me ;)
I thought that Brian's original suggestion was about
being
able
to
host
Cordova platforms directly on NPM. That's why each
one
would
require
a
package.json. (which would probably end up in
<project>/platforms/<platform> in a project, but
that's
not
the
point
of
it).
As an NPM project, we then would have the
opportunity
(though
not
the
obligation) to make all of the supporting scripts for
each
platform
(create, build, run, etc) part of the node module,
for
a
uniform
interface
that doesn't require going through the command line.
It's not about making platforms into CLI
dependencies
(any
more
than
plugins are CLI dependencies right now), or about
making
a
cordova-based
project into a node package.
If that's right, then I support that -- I'd like the
platforms
to
be
installable through npm, and to be versioned
separately,
installable
separately, and scriptable without having to spawn
subshells.
And if I have it completely wrong, then let me
know
--
I'll
just
go
back
to
fixing File bugs ;)
On Mon, Jun 2, 2014 at 3:29 PM, Andrew Grieve <
agri...@chromium.org>
wrote:
Not sure what your question is.
On Mon, Jun 2, 2014 at 2:03 PM, Brian LeRoux <
b...@brian.io>
wrote:
*ahem
On Wed, May 28, 2014 at 11:20 AM, Brian LeRoux <
b...@brian.io
wrote:
npm i cordova-ios@3.5.0
Right?
On May 27, 2014 11:06 PM, "Andrew Grieve" <
agri...@chromium.org
wrote:
Lazy loading is what will give us the ability to
support
multiple
versions
of platforms.
If we don't support users choosing the version of
the
platform
they
want,
then they will resist updating their version of
CLI
(like
they
do
right
now).
I'm very keen to allow users to chose their
platform
versions,
just
as
they
are able to choose their plugin versions.
On Tue, May 27, 2014 at 5:57 PM, Mark
Koudritsky
<
kam...@google.com
wrote:
+1
Steve published (some of?) the platforms on
npm
as
part
of
the
latest
release.
https://www.npmjs.org/package/cordova-android
https://www.npmjs.org/package/cordova-ios
CLI already require()s npm for downloading
plugins
from
the
registry.
Extending this to platforms is on my todo list for
this\next
week.
The "lazy" part of the loading was about
caching,
so
we
don't
lose
it
since
npm does its own caching.
On Tue, May 27, 2014 at 5:42 PM, Parashuram
Narasimhan
(MS
OPEN
TECH)
<
panar...@microsoft.com> wrote:
+1. This will also be a step towards
releasing
platforms
independently.
Will the CLI have a semver like dependency on
--
Carlos Santana
<csantan...@gmail.com>