Gorkem,

I also found an old JIRA duplicate issue for this which had listed an old
suggestion I think is interesting:
https://issues.apache.org/jira/browse/CB-4624

Specifically, instead of introducing save/restore commands, we could mirror
"npm install" and its use of "--save":
- npm install -> cordova plugin add
  - restores deps
- npm install foo -> cordova plugin add foo
  - install foo, but don't add it to deps
- npm install foo --save -> cordova plugin add foo --save
  - install foo, and do add it to deps
- npm install --save -> cordova plugin add --save
  - don't install anything, just save the current installed plugins into
deps

Just something to consider.

(note, just tried it again and npm install --save doesn't actually do what
I want.. wonder if its supported..)

-Michal


On Wed, Apr 23, 2014 at 11:39 PM, Michal Mocny <mmo...@chromium.org> wrote:

> Gorkem, as an orthogonal issue to the syntax we use, I think there is
> another small problem with this patch as-is.
>
> "cordova plugin add org.apache.cordova.file-transfer && cordova plugin
> save" would have my application explicitly depend on
> org.apache.cordova.file.  If in the future the dependency is
> removed/moved/renamed, my app would explicitly try to install it when
> running "cordova plugin restore".
>
> As a first version I think this is acceptable, but I think we may want a
> better solution eventually.
>
>
> On Tue, Apr 22, 2014 at 1:18 PM, Michal Mocny <mmo...@chromium.org> wrote:
>
>>
>>
>>
>> On Tue, Apr 22, 2014 at 11:37 AM, Gorkem Ercan <gorkem.er...@gmail.com>wrote:
>>
>>> On Fri, Apr 18, 2014 at 7:21 PM, Michal Mocny <mmo...@chromium.org>
>>> wrote:
>>>
>>> > On Fri, Apr 18, 2014 at 4:11 PM, Gorkem Ercan <gorkem.er...@gmail.com
>>> > >wrote:
>>> >
>>> > > On Thu, Apr 17, 2014 at 3:46 PM, Michal Mocny <mmo...@chromium.org>
>>> > wrote:
>>> > >
>>> > > > Took a quick glance.  General questions:
>>> > > > - why the need for save?  Why not just alter the list on each
>>> cordova
>>> > > > plugin add/rm?
>>> > > >
>>> > >
>>> > > I do not want to force this workflow. Calling save does not bring
>>> much
>>> > > overhead, considering plugin list does not probably change
>>> constantly.
>>> > >
>>> >
>>> > If you are going to make this choice, then I would not like to
>>> > automatically install on prepare.  There should be an explicit "load"
>>> > command.  (those names are wrong, but you get the point).
>>> >
>>> > Either we automatically manage plugin installs, or explicitly manage
>>> them.
>>> >  I'm happy to start with explicit and support opt-in to automatic
>>> handling
>>> > later once we have confidence in the feature.
>>> >
>>>
>>> Makes sense... adding a 'restore' command and removing from prepare. We
>>> can
>>> add an auto-restore config in the next iteration.
>>>
>>
>> Excellent, thanks.
>>
>>
>>>
>>>
>>> >
>>> >
>>> > >
>>> > >
>>> > > > - wouldn't "cordova plugin rm foo && cordova prepare" re-install
>>> that
>>> > > > plugin right now?
>>> > > >
>>> > >
>>> > > This workflow would require an explicit update to config.xml if a
>>> plugin
>>> > is
>>> > > persisted in there. This is a good point, I shall update plugins rm
>>> to
>>> > > print a warning about it.
>>> >
>>> >
>>> > >
>>> > > > - why the name <feature> and not <dependency> ?  I think this
>>> > > functionality
>>> > > > should overlap with the plugin.xml spec.
>>> > > >
>>> > > >
>>> > > feature tag lives in the w3c widget spec which has advantages for
>>> those
>>> > > (like myself)  who does provide tools for editing config,xml.
>>> > >
>>> >
>>> > We are no longer using that spec, and I as we move more functionality
>>> from
>>> > plugins.xml into config.xml we should strive to keep them in line.  It
>>> also
>>> > makes our docs easier.
>>> >
>>> >
>>> Tools developers are people too :) I think plugin.xml and config.xml has
>>> two different audiences, I think there is a comparatively small
>>> intersection of developers who are interested on both. At the moment, we
>>> are pretty much within the w3c spec with the top-level config.xml and I
>>> do
>>> not see the benefit of breaking it.
>>>
>>
>> Actually, I am thinking about tools devs.  Namely, our tools devs who
>> should be using the same config parsing and handlers for dependency
>> management, etc.
>>
>> Anyway.  You are putting in the sweat and blood on this feature, so you
>> get double the voting power on this as far as I'm concerned.  Still, I
>> think we should bring this to the attention of the list to see how everyone
>> feels.  Sound fair?  I'll start a quick thread.
>>
>>
>>>
>>>
>>> >
>>> > >
>>> > >
>>> > >
>>> > > > I haven't put the PR through testing yet.
>>> > > >
>>> > > >
>>> > > > On Thu, Apr 17, 2014 at 5:54 PM, Jesse <purplecabb...@gmail.com>
>>> > wrote:
>>> > > >
>>> > > > > Yeah, that looks weird.
>>> > > > >
>>> > > > > @purplecabbage
>>> > > > > risingj.com
>>> > > > >
>>> > > > >
>>> > > > > On Thu, Apr 17, 2014 at 2:46 PM, kamrik <g...@git.apache.org>
>>> wrote:
>>> > > > >
>>> > > > > > Github user kamrik commented on a diff in the pull request:
>>> > > > > >
>>> > > > > >
>>> > > >
>>> https://github.com/apache/cordova-cli/pull/165#discussion_r11755812
>>> > > > > >
>>> > > > > >     --- Diff: src/save.js ---
>>> > > > > >     @@ -0,0 +1,71 @@
>>> > > > > >     +/**
>>> > > > > >     +    Licensed to the Apache Software Foundation (ASF)
>>> under one
>>> > > > > >     +    or more contributor license agreements.  See the
>>> NOTICE
>>> > file
>>> > > > > >     +    distributed with this work for additional information
>>> > > > > >     +    regarding copyright ownership.  The ASF licenses this
>>> file
>>> > > > > >     +    to you under the Apache License, Version 2.0 (the
>>> > > > > >     +    "License"); you may not use this file except in
>>> compliance
>>> > > > > >     +    with the License.  You may obtain a copy of the
>>> License at
>>> > > > > >     +
>>> > > > > >     +    http://www.apache.org/licenses/LICENSE-2.0
>>> > > > > >     +
>>> > > > > >     +    Unless required by applicable law or agreed to in
>>> writing,
>>> > > > > >     +    software distributed under the License is distributed
>>> on
>>> > an
>>> > > > > >     +    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> > > > > >     +    KIND, either express or implied.  See the License for
>>> the
>>> > > > > >     +    specific language governing permissions and
>>> limitations
>>> > > > > >     +    under the License.
>>> > > > > >     +*/
>>> > > > > >     +
>>> > > > > >     +var cordova_util     = require('./util'),
>>> > > > > >     +    ConfigParser     = require('./ConfigParser'),
>>> > > > > >     +    path             = require('path'),
>>> > > > > >     +    xml              =require('./xml-helpers')
>>> > > > > >     +    Q                = require('q'),
>>> > > > > >     +    events           = require('./events');
>>> > > > > >     +
>>> > > > > >     +;
>>> > > > > >     +
>>> > > > > >     +
>>> > > > > >     +module.exports = function save(target){
>>> > > > > >     +  var projectHome = cordova_util.cdProjectRoot();
>>> > > > > >     +  var configPath =
>>> cordova_util.projectConfig(projectHome);
>>> > > > > >     +  var configXml = new ConfigParser(configPath);
>>> > > > > >     +  var pluginsPath = path.join(projectHome, 'plugins');
>>> > > > > >     +  var plugins = cordova_util.findPlugins(pluginsPath);
>>> > > > > >     +
>>> > > > > >     +  return Q.all(plugins.map(function(plugin){
>>> > > > > >     +    var currentPluginPath = path.join(pluginsPath,plugin);
>>> > > > > >     +    var name = readPluginName(currentPluginPath);
>>> > > > > >     +    var id = plugin;
>>> > > > > >     +    var version = readPluginVersion(currentPluginPath);
>>> > > > > >     +    var features = configXml.doc.findall('feature');
>>> > > > > >     +      for(var i=0; i<features.length; i++){
>>> > > > > >     +        if(features[i].attrib.name === name){
>>> > > > > >     +          events.emit('results', 'An entry for "'+
>>> plugin+ '"
>>> > > > > already
>>> > > > > > exists');
>>> > > > > >     +          return Q();
>>> > > > > >     +        }
>>> > > > > >     +      }
>>> > > > > >     +    configXml.addFeature(name, JSON.parse('[{"name":"id",
>>> > > > > > "value":"'+id+'"},{"name":"version",
>>> "value":"'+version+'"}]'));
>>> > > > > >     --- End diff --
>>> > > > > >
>>> > > > > >     I might be missing something, but why JSON.parse() rather
>>> than
>>> > > just
>>> > > > > > literal array of objects?
>>> > > > > >
>>> > > > > >
>>> > > > > > ---
>>> > > > > > If your project is set up for it, you can reply to this email
>>> and
>>> > > have
>>> > > > > your
>>> > > > > > reply appear on GitHub as well. If your project does not have
>>> this
>>> > > > > feature
>>> > > > > > enabled and wishes so, or if the feature is enabled but not
>>> > working,
>>> > > > > please
>>> > > > > > contact infrastructure at infrastruct...@apache.org or file a
>>> JIRA
>>> > > > > ticket
>>> > > > > > with INFRA.
>>> > > > > > ---
>>> > > > > >
>>> > > > >
>>> > > >
>>> > >
>>> >
>>>
>>
>>
>

Reply via email to