[ 
https://issues.apache.org/jira/browse/CB-8197?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14285756#comment-14285756
 ] 

ASF GitHub Bot commented on CB-8197:
------------------------------------

Github user agrieve commented on a diff in the pull request:

    https://github.com/apache/cordova-ios/pull/126#discussion_r23305562
  
    --- Diff: bin/templates/scripts/cordova/lib/run.js ---
    @@ -0,0 +1,184 @@
    +/*
    +       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.
    +*/
    +
    +/*jshint node: true*/
    +
    +var Q = require('q'),
    +    nopt  = require('nopt'),
    +    path  = require('path'),
    +    shell = require('shelljs'),
    +    build = require('./build'),
    +    spawn = require('./spawn'),
    +    check_reqs = require('./check_reqs');
    +
    +var cordovaPath = path.join(__dirname, '..');
    +var projectPath = path.join(__dirname, '..', '..');
    +
    +module.exports.run = function (argv) {
    +
    +    // parse args here
    +    // --debug and --release args not parsed here
    +    // but still valid since they can be passed down to build command 
    +    var args  = nopt({
    +        // "archs": String,     // TODO: add support for building 
different archs
    +        "list": Boolean,
    +        "nobuild": Boolean,
    +        "device": Boolean, "emulator": Boolean, "target": String
    +    }, {}, argv);
    +
    +    // Validate args
    +    if (args.device && args.emulator) {
    +        return Q.reject('Only one of "device"/"emulator" options should be 
specified');
    +    }
    +
    +    // validate target device for ios-sim
    +    // Valid values for "--target" (case sensitive):
    +    var validTargets = ["iPhone-4s", "iPhone-5", "iPhone-5s", 
"iPhone-6-Plus", "iPhone-6",
    +        "iPad-2", "iPad-Retina", "iPad-Air", "Resizable-iPhone", 
"Resizable-iPad"];
    +    if (args.target && validTargets.indexOf(args.target) < 0 ) {
    +        return Q.reject(args.target + " is not a valid target for 
emulator");
    +    }
    +
    +    // check for either ios-sim or ios-deploy is available
    +    // depending on arguments provided
    +    var checkTools = args.device ? check_reqs.check_ios_deploy() : 
check_reqs.check_ios_sim();
    +
    +    // support for CB-8168 `cordova/run --list`
    +    if (args.list) {
    +        if (args.device) return listDevices();
    +        if (args.emulator) return listEmulators();
    +        return listDevices().then(function () {
    +            return listEmulators();
    +        });
    +    }
    +
    +    return checkTools.then(function () {
    +        if (args.nobuild) {
    +            // --nobuild option is passed. Skipping build...
    +            return Q();
    +        }
    +        // if --nobuild isn't specified then build app first
    +        return build.run(argv);
    +    }).then(function () {
    +
    +        var xcodeProjFiles = shell.ls(projectPath).filter(function (name) {
    +            return path.extname(name) === '.xcodeproj';
    +        });
    +        
    +        if (xcodeProjFiles.length === 0) {
    +            return Q.reject("No Xcode project found in " + projectPath);
    +        }
    +        if (xcodeProjFiles.length > 1) {
    +            console.warn('Found multiple .xcodeproj directories in \n' +
    +                projectPath + '\nUsing first one');
    +        }
    +
    +        var projectName = path.basename(xcodeProjFiles[0], '.xcodeproj');
    +
    +        var appPath = path.join(projectPath, 'build', (args.device ? 
'device' : 'emulator'), projectName + '.app');
    +        // select command to run and arguments depending whether
    +        // we're running on device/emulator
    +        if (args.device) {
    +            return checkDeviceConnected().then(function () {
    +                return deployToDevice(appPath);
    +            }).fail(function () {
    +                // if device connection check failed use emulator then
    +                return deployToSim(appPath, args.target);
    +            });
    +        } else {
    +            return deployToSim(appPath, args.target);
    +        }
    +    });
    +};
    +
    +/**
    + * Checks if any iOS device is connected
    + * @return {Promise} Fullfilled when any device is connected, rejected 
otherwise
    + */
    +function checkDeviceConnected() {
    +    return spawn('ios-deploy', ['-c']);
    +}
    +
    +/**
    + * Deploy specified app package to connected device
    + * using ios-deploy command
    + * @param  {String} appPath Path to application package
    + * @return {Promise}        Resolves when deploy succeeds otherwise rejects
    + */
    +function deployToDevice(appPath) {
    +    // Deploying to device...
    +    return spawn('ios-deploy', ['-d', '-b', appPath]);
    +}
    +
    +/**
    + * Deploy specified app package to ios-sim simulator
    + * @param  {String} appPath Path to application package
    + * @param  {String} target  Target device type
    + * @return {Promise}        Resolves when deploy succeeds otherwise rejects
    + */
    +function deployToSim(appPath, target) {
    +    // Select target device for emulator. Default is 'iPhone-6' 
    +    if (!target) {
    +        target = 'iPhone-6';
    +        console.log('No target specified for emulator. Deploying to ' + 
target + ' simulator');
    +    }
    +    var logPath = path.join(cordovaPath, 'console.log');
    +    var simArgs = ['launch', appPath,
    +        '--devicetypeid', 'com.apple.CoreSimulator.SimDeviceType.' + 
target,
    +        // We need to redirect simulator output here to use cordova/log 
command
    +        // TODO: Is there any other way to get emulator's output to use in 
log command?
    +        '--stderr', logPath, '--stdout', logPath,
    +        '--exit'];
    +    return spawn('ios-sim', simArgs);
    +}
    +
    +function listDevices() {
    +    var listDevicesScript = path.join(cordovaPath, 'lib', 'list-devices');
    +    console.log("Available iOS Devices:");
    +    return spawn(listDevicesScript);
    --- End diff --
    
    why spawn these rather than require() them?


> Switch to nodejs for ios platform scripts
> -----------------------------------------
>
>                 Key: CB-8197
>                 URL: https://issues.apache.org/jira/browse/CB-8197
>             Project: Apache Cordova
>          Issue Type: Improvement
>          Components: iOS
>            Reporter: Vladimir Kotikov
>
> Currently platform tooling for ios is based on bash scripts and to improve 
> maintainability of such scripts it would be useful to port them to NodeJS.
> Part of this work is already done for create/update scripts in 
> https://issues.apache.org/jira/browse/CB-5706 but platform scripts placed in 
> cordova folder of platform is still being unported.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org
For additional commands, e-mail: issues-h...@cordova.apache.org

Reply via email to