diff --git a/lib/pbxProject.js b/lib/pbxProject.js index d0f9cf2..d2a9192 100644 --- a/lib/pbxProject.js +++ b/lib/pbxProject.js @@ -338,32 +338,43 @@ pbxProject.prototype.addFramework = function(fpath, opt) { file.fileRef = this.generateUuid(); file.target = opt ? opt.target : undefined; - if (this.hasFile(file.path)) return false; - - this.addToPbxBuildFileSection(file); // PBXBuildFile - this.addToPbxFileReferenceSection(file); // PBXFileReference - this.addToFrameworksPbxGroup(file); // PBXGroup + var fileReference = this.hasFile(file.path); + if (fileReference) { + var key = this.getFileKey(file.path); + file.fileRef = key; + } else { + this.addToPbxFileReferenceSection(file); // PBXFileReference + this.addToFrameworksPbxGroup(file); // PBXGroup + } if (link) { - this.addToPbxFrameworksBuildPhase(file); // PBXFrameworksBuildPhase + const buildFileUuid = this.addToPbxFrameworksBuildPhase(file); + if(buildFileUuid === file.uuid) { // PBXFrameworksBuildPhase) + this.addToPbxBuildFileSection(file); // PBXBuildFile + } else { + file.uuid = buildFileUuid; + } } if (customFramework) { this.addToFrameworkSearchPaths(file); if (embed) { - opt.embed = embed; - var embeddedFile = new pbxFile(fpath, opt); - - embeddedFile.uuid = this.generateUuid(); - embeddedFile.fileRef = file.fileRef; - - //keeping a separate PBXBuildFile entry for Embed Frameworks - this.addToPbxBuildFileSection(embeddedFile); // PBXBuildFile - - this.addToPbxEmbedFrameworksBuildPhase(embeddedFile); // PBXCopyFilesBuildPhase + opt.embed = embed; + var embeddedFile = new pbxFile(fpath, opt); + + embeddedFile.uuid = this.generateUuid(); + embeddedFile.fileRef = file.fileRef; + embeddedFile.target = file.target; + const embedBuildFileUuid = this.addToPbxEmbedFrameworksBuildPhase(embeddedFile); + if(embedBuildFileUuid === embeddedFile.uuid) { // PBXCopyFilesBuildPhase + //keeping a separate PBXBuildFile entry for Embed Frameworks + this.addToPbxBuildFileSection(embeddedFile); // PBXBuildFile + } else { + embeddedFile.uuid = embedBuildFileUuid; + } - return embeddedFile; + return embeddedFile; } } @@ -856,10 +867,26 @@ pbxProject.prototype.removeFromFrameworksPbxGroup = function(file) { } } +function getReferenceInPbxBuildFile(buildFileReferences, fileReference) { + var buildFileSection = this.pbxBuildFileSection(); + for(let buildFileReference of buildFileReferences) { + if(buildFileSection[buildFileReference.value] && buildFileSection[buildFileReference.value].fileRef === fileReference.fileRef){ + return buildFileReference.value; + } + } +} + pbxProject.prototype.addToPbxEmbedFrameworksBuildPhase = function (file) { var sources = this.pbxEmbedFrameworksBuildPhaseObj(file.target); + if (sources) { + var referenceUuid = getReferenceInPbxBuildFile.call(this, sources.files, file) + if(referenceUuid){ + return referenceUuid; + } + sources.files.push(pbxBuildPhaseObj(file)); + return file.uuid; } } @@ -933,7 +960,16 @@ pbxProject.prototype.removeFromPbxResourcesBuildPhase = function(file) { pbxProject.prototype.addToPbxFrameworksBuildPhase = function(file) { var sources = this.pbxFrameworksBuildPhaseObj(file.target); - sources.files.push(pbxBuildPhaseObj(file)); + + if (sources) { + var frameworkBuildUuid = getReferenceInPbxBuildFile.call(this, sources.files, file); + if (frameworkBuildUuid) { + return frameworkBuildUuid; + } + + sources.files.push(pbxBuildPhaseObj(file)); + return file.uuid; + } } pbxProject.prototype.removeFromPbxFrameworksBuildPhase = function(file) { @@ -1353,8 +1389,10 @@ pbxProject.prototype.addToFrameworkSearchPaths = function(file) { || buildSettings['FRAMEWORK_SEARCH_PATHS'] === INHERITED) { buildSettings['FRAMEWORK_SEARCH_PATHS'] = [INHERITED]; } - - buildSettings['FRAMEWORK_SEARCH_PATHS'].push(searchPathForFile(file, this)); + var searchPath = searchPathForFile(file, this); + if(buildSettings['FRAMEWORK_SEARCH_PATHS'].indexOf(searchPath) < 0){ + buildSettings['FRAMEWORK_SEARCH_PATHS'].push(searchPath); + } } } @@ -1565,6 +1603,19 @@ pbxProject.prototype.hasFile = function(filePath) { return false; } +pbxProject.prototype.getFileKey = function(filePath) { + var files = nonComments(this.pbxFileReferenceSection()), + file, id; + for (id in files) { + file = files[id]; + if (file.path == filePath || file.path == ('"' + filePath + '"')) { + return id; + } + } + + return false; +} + pbxProject.prototype.addTarget = function(name, type, subfolder) { // Setup uuid and name of new target diff --git a/package.json b/package.json index 8ded6af..5591b6a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "name": "nativescript-dev-xcode", "description": "parser for xcodeproj/project.pbxproj files", "main": "index.js", - "version": "0.1.0", + "version": "0.2.0", "repository": { "url": "https://github.com/NativeScript/nativescript-dev-xcode.git" }, diff --git a/test/addFramework.js b/test/addFramework.js index 17b5551..b0bbcab 100644 --- a/test/addFramework.js +++ b/test/addFramework.js @@ -188,10 +188,20 @@ exports.addFramework = { test.done(); }, 'duplicate entries': { - 'should return false': function (test) { + 'should return same build file': function (test) { var newFile = proj.addFramework('libsqlite3.dylib'); + var sameFile = proj.addFramework('libsqlite3.dylib'); - test.ok(!proj.addFramework('libsqlite3.dylib')); + test.equal(newFile.uuid, sameFile.uuid); + test.equal(newFile.fileRef, sameFile.fileRef); + test.done(); + }, + 'should return different build file with same ref for different target': function (test) { + var newFile = proj.addFramework('libsqlite3.dylib'); + var differentFile = proj.addFramework('libsqlite3.dylib', { target: "1D6058900D05DD3D006BFB54"}); + + test.notEqual(newFile.uuid, differentFile.uuid); + test.equal(newFile.fileRef, differentFile.fileRef); test.done(); } }, diff --git a/test/fixtures/full-project.json b/test/fixtures/full-project.json index 09ec88e..dc8cf6f 100644 --- a/test/fixtures/full-project.json +++ b/test/fixtures/full-project.json @@ -564,7 +564,15 @@ ], "runOnlyForDeploymentPostprocessing": 0 }, - "1D60588F0D05DD3D006BFB54_comment": "Frameworks" + "1D60588F0D05DD3D006BFB54_comment": "Frameworks", + "2D60588F0D05DD3D006BFB55": { + "isa": "PBXFrameworksBuildPhase", + "buildActionMask": 2147483647, + "files": [ + ], + "runOnlyForDeploymentPostprocessing": 0 + }, + "2D60588F0D05DD3D006BFB55_comment": "Frameworks" }, "PBXGroup": { "080E96DDFE201D6D7F000001": { @@ -866,7 +874,7 @@ "comment": "Sources" }, { - "value": "1D60588F0D05DD3D006BFB54", + "value": "2D60588F0D05DD3D006BFB55", "comment": "Frameworks" } ],