[
https://issues.apache.org/jira/browse/CB-9825?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15374023#comment-15374023
]
ASF GitHub Bot commented on CB-9825:
------------------------------------
Github user juliascript commented on a diff in the pull request:
https://github.com/apache/cordova-ios/pull/234#discussion_r70545166
--- Diff: bin/templates/scripts/cordova/lib/podMod.js ---
@@ -0,0 +1,162 @@
+var fs = require('fs');
+var util = require('util');
+var events = require('cordova-common').events;
+var superspawn = require('cordova-common').superspawn;
+var CordovaError = require('cordova-common').CordovaError;
+var opts = {};
+/*
+-- After pods are installed in a .xcworkspace, all existing ios code needs
to go into the WORKSPACE file -- will need to
+ create a workspace file and then embed the Xcode project
+
+ - Holly might have done some work on this, see the docs:
+ https://github.com/phonegap/phonegap-webview-ios not sure how
applicable it can be to our case
+*/
+function removeProjectFromPath (pathToProjectFile) {
+ var array = [];
+ //remove the project from the path
+ array = pathToProjectFile.split('/');
+ array.pop();
+ var path = array.join('/');
+ return path;
+}
+
+function createPodfile (projectName, pathToProjectFile) {
+ var path = removeProjectFromPath(pathToProjectFile);
+ var pathToPodfile = path + '/Podfile';
+ var podfileText = util.format('platform :ios, \'8.0\'\n\ntarget \'%s\'
do\n\n project \'%s\'\n\n \n\nend' , projectName, pathToProjectFile);
+ fs.writeFileSync(pathToPodfile, podfileText);
+}
+
+function editPodfileSync (Podfile, pod, isRemoval) {
+ var podfileContents = fs.readFileSync(Podfile, 'utf8');
+ //split by \n, add in the pod after the project line, shift the rest
down
+ var podfileContentsArray = podfileContents.split('\n');
+ var linesInPodfileToKeep = [];
+
+ if (isRemoval) {
+ podfileContentsArray.forEach (function (lineInPodfile) {
+ //if the line in Podfile is the pod to rm, don't save it to
new array (to be returned)
+ if (!lineInPodfile.includes(pod)){
+ linesInPodfileToKeep.push(lineInPodfile);
+ }
+ });
+ podfileContents = linesInPodfileToKeep.join('\n');
+ } else {
+ podfileContentsArray.splice(5, 0, pod);
+ podfileContents = podfileContentsArray.join('\n');
+ }
+ return podfileContents;
+}
+
+function superspawnPodInstall (path, isPathToProjectFile) {
+ // change working directory for all calls of pod install to
platforms/ios
+ if (isPathToProjectFile){
+ //if the path passed leads to the project, and not the dir that
contains the proj
+ //remove the project from the path
+ path = removeProjectFromPath(path);
+ }
+ opts.cwd = path;
+ superspawn.spawn('pod', ['install'], opts);
+}
+
+function installPodSync (projectName, pathToProjectFile, nameOfPod,
podSpec, podsJSON) {
+ // called from cordova project directory-- when invoked, args are as
follows
+ // projectName = cordovaProject (name) and
+ // pathToProjectFile = ./path/to/cordovaProject
+ // nameOfPod = obj.src //from framework
tag
+ // podSpec = obj.spec //from framework
tag
+ // podsJSON = pods.json file in
cordovaProjectDir/platforms/ios/
+
+ // readFileSync will currently truncate the Podfile if it exists
+ // if a Podfile doesn't exist, one will be created
+
+ // this code will be run during cordova plugin add x -- which has to
be run in the cordova project dir
+
+ //-----------
+ //ERROR
+ //
+ //if no podName is specified, console err
+ if (nameOfPod === '' || nameOfPod === ' '){
+ throw new CordovaError('\nERROR: name of pod is not specified\n');
+ }
+ //-----------
+
+ podSpec = podSpec || ''; //spec is optional
+
+ var stringToWrite; //overwrites Podfile
+ var lineToInjectInPodfile; //adds pod
+ var path = removeProjectFromPath(pathToProjectFile);
+ var podfile = path + '/Podfile';
+ var podfileExistsInCurrentDirectory = fs.existsSync(podfile);
//bool
+ var podExistsInPodsJSON = podsJSON[nameOfPod];
//bool
+ var podRequestedForSpecChange;
//bool
+
+ if (podSpec === '') {
+ lineToInjectInPodfile = util.format('pod \'%s\'', nameOfPod);
+ podRequestedForSpecChange = false;
+ } else {
+ if (podExistsInPodsJSON){
+ if (podsJSON[nameOfPod].spec == podSpec){
+ //-----------
+ //ERROR
+ //
+ // if pod spec is the one already in the Podfile,
+ // do nothing to the Podfile, return error
+ throw new CordovaError('\nERROR: pod already installed in
Podfile, according to pods.json');
+ //------------
+ } else {
+ podRequestedForSpecChange = true;
+ }
+ } else {
+ lineToInjectInPodfile = util.format('pod \'%s\', \'%s\'',
nameOfPod, podSpec);
+ podRequestedForSpecChange = false;
+ }
+ }
+
+ //does Podfile exist in the current directory?
+ if (podfileExistsInCurrentDirectory) {
+ events.emit('verbose', 'Podfile found in platforms/ios');
+ //is the pod already in the Podfile?
+ if (podExistsInPodsJSON) {
+ events.emit('verbose', 'Selected pod already exists in Podfile
according to pods.json');
+ //if pod is in Podfile, is there a change in spec?
+ if (podRequestedForSpecChange) {
+ //if spec change requested, replace the line in the
Podfile with the correct spec
+ events.emit('verbose', 'Pod requested for spec change');
+ } // no change in spec handled above
+ } else if (!podExistsInPodsJSON) {
+ //if pod not already in Podfile, inject the line in the
existing Podfile
+ events.emit('verbose', 'Pod not found in Podfile. Injecting
now...');
+ stringToWrite = editPodfileSync(podfile,
lineToInjectInPodfile);
+ }
+ } else if (!podfileExistsInCurrentDirectory) {
+ //create the Podfile and inject the line
+ events.emit('verbose', 'Creating new Podfile in platforms/ios');
+ createPodfile(projectName, pathToProjectFile);
+ events.emit('verbose', 'Adding pod to Podfile');
+ stringToWrite = editPodfileSync(podfile, lineToInjectInPodfile);
+ }
+
+ if (stringToWrite) {
+ events.emit('verbose', 'Overwriting Podfile');
+ fs.writeFileSync(podfile, stringToWrite);
+ } else {
+ //the code should have returned early by now
+ }
+ events.emit('verbose', 'Pods installed in xcode workspace in
platforms/ios');
+}
+
+function uninstallPod (projectDirectory, pod) {
+ //split podfile by \n
+ //for each, does each.includes(pod)? if so, remove that line
+ //that will correspond to the line in the podfile, given the amt of
pods currently installed in the podfile...
+ var podfile = projectDirectory + '/Podfile';
+ var stringToWrite = editPodfileSync(podfile, pod, true);
+ fs.writeFileSync(podfile, stringToWrite);
+}
+
+module.exports = {
+ installPodSync : installPodSync,
--- End diff --
👍
> Support third-party package managers like Cocoapods and Nuget
> -------------------------------------------------------------
>
> Key: CB-9825
> URL: https://issues.apache.org/jira/browse/CB-9825
> Project: Apache Cordova
> Issue Type: New Feature
> Components: CordovaLib
> Reporter: Shazron Abdullah
> Assignee: Julia Geist
> Labels: cordova-ios-5.0.x
>
> ML discussion:
> http://markmail.org/message/5qvg6rwr4nz4q7mc
> cordova-discuss proposal (to be brought back to the list when finalized):
> https://github.com/cordova/cordova-discuss/blob/master/proposals/ThirdPartyPackageManagers.md
> From Steve Gill in the ML:
> At the Cordova F2F, everyone seemed to agree that we should bring CocoaPods
> support to plugins as dependencies for iOS.
> Cordova-android currently uses Gradle as a way to enable external
> dependency resolution for plugins using the framework tag.
> A suggestion about using the engine tag to fetch cocoapods-cli (mac) &
> NuGet (windows) followed by using the framework tag was discussed.
> The minutes[1] show Carlos, Shaz and Raghav as looking into the design.
> Someone should write up a proposal on cordova-discuss[2] and create the
> issues. Post them in this thread.
> This shouldn't take priority over cordova-ios 4 issues.
> [1]
> https://docs.google.com/document/d/1MArKRmnLS052LBbhPxJF57_4ZivghOj8znWo5sTCkbU/edit?usp=sharing
> [2] https://github.com/cordova/cordova-discuss
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]