Skip to content

Commit 2c88692

Browse files
authored
Merge pull request #10 from NativeScript/kddimitrov/fix-add-framework
Kddimitrov/fix add framework
2 parents 0e6634d + 003bba7 commit 2c88692

File tree

4 files changed

+94
-25
lines changed

4 files changed

+94
-25
lines changed

lib/pbxProject.js

+71-20
Original file line numberDiff line numberDiff line change
@@ -338,32 +338,43 @@ pbxProject.prototype.addFramework = function(fpath, opt) {
338338
file.fileRef = this.generateUuid();
339339
file.target = opt ? opt.target : undefined;
340340

341-
if (this.hasFile(file.path)) return false;
342-
343-
this.addToPbxBuildFileSection(file); // PBXBuildFile
344-
this.addToPbxFileReferenceSection(file); // PBXFileReference
345-
this.addToFrameworksPbxGroup(file); // PBXGroup
341+
var fileReference = this.hasFile(file.path);
342+
if (fileReference) {
343+
var key = this.getFileKey(file.path);
344+
file.fileRef = key;
345+
} else {
346+
this.addToPbxFileReferenceSection(file); // PBXFileReference
347+
this.addToFrameworksPbxGroup(file); // PBXGroup
348+
}
346349

347350
if (link) {
348-
this.addToPbxFrameworksBuildPhase(file); // PBXFrameworksBuildPhase
351+
const buildFileUuid = this.addToPbxFrameworksBuildPhase(file);
352+
if(buildFileUuid === file.uuid) { // PBXFrameworksBuildPhase)
353+
this.addToPbxBuildFileSection(file); // PBXBuildFile
354+
} else {
355+
file.uuid = buildFileUuid;
356+
}
349357
}
350358

351359
if (customFramework) {
352360
this.addToFrameworkSearchPaths(file);
353361

354362
if (embed) {
355-
opt.embed = embed;
356-
var embeddedFile = new pbxFile(fpath, opt);
357-
358-
embeddedFile.uuid = this.generateUuid();
359-
embeddedFile.fileRef = file.fileRef;
360-
361-
//keeping a separate PBXBuildFile entry for Embed Frameworks
362-
this.addToPbxBuildFileSection(embeddedFile); // PBXBuildFile
363-
364-
this.addToPbxEmbedFrameworksBuildPhase(embeddedFile); // PBXCopyFilesBuildPhase
363+
opt.embed = embed;
364+
var embeddedFile = new pbxFile(fpath, opt);
365+
366+
embeddedFile.uuid = this.generateUuid();
367+
embeddedFile.fileRef = file.fileRef;
368+
embeddedFile.target = file.target;
369+
const embedBuildFileUuid = this.addToPbxEmbedFrameworksBuildPhase(embeddedFile);
370+
if(embedBuildFileUuid === embeddedFile.uuid) { // PBXCopyFilesBuildPhase
371+
//keeping a separate PBXBuildFile entry for Embed Frameworks
372+
this.addToPbxBuildFileSection(embeddedFile); // PBXBuildFile
373+
} else {
374+
embeddedFile.uuid = embedBuildFileUuid;
375+
}
365376

366-
return embeddedFile;
377+
return embeddedFile;
367378
}
368379
}
369380

@@ -856,10 +867,26 @@ pbxProject.prototype.removeFromFrameworksPbxGroup = function(file) {
856867
}
857868
}
858869

870+
function getReferenceInPbxBuildFile(buildFileReferences, fileReference) {
871+
var buildFileSection = this.pbxBuildFileSection();
872+
for(let buildFileReference of buildFileReferences) {
873+
if(buildFileSection[buildFileReference.value] && buildFileSection[buildFileReference.value].fileRef === fileReference.fileRef){
874+
return buildFileReference.value;
875+
}
876+
}
877+
}
878+
859879
pbxProject.prototype.addToPbxEmbedFrameworksBuildPhase = function (file) {
860880
var sources = this.pbxEmbedFrameworksBuildPhaseObj(file.target);
881+
861882
if (sources) {
883+
var referenceUuid = getReferenceInPbxBuildFile.call(this, sources.files, file)
884+
if(referenceUuid){
885+
return referenceUuid;
886+
}
887+
862888
sources.files.push(pbxBuildPhaseObj(file));
889+
return file.uuid;
863890
}
864891
}
865892

@@ -933,7 +960,16 @@ pbxProject.prototype.removeFromPbxResourcesBuildPhase = function(file) {
933960

934961
pbxProject.prototype.addToPbxFrameworksBuildPhase = function(file) {
935962
var sources = this.pbxFrameworksBuildPhaseObj(file.target);
936-
sources.files.push(pbxBuildPhaseObj(file));
963+
964+
if (sources) {
965+
var frameworkBuildUuid = getReferenceInPbxBuildFile.call(this, sources.files, file);
966+
if (frameworkBuildUuid) {
967+
return frameworkBuildUuid;
968+
}
969+
970+
sources.files.push(pbxBuildPhaseObj(file));
971+
return file.uuid;
972+
}
937973
}
938974

939975
pbxProject.prototype.removeFromPbxFrameworksBuildPhase = function(file) {
@@ -1353,8 +1389,10 @@ pbxProject.prototype.addToFrameworkSearchPaths = function(file) {
13531389
|| buildSettings['FRAMEWORK_SEARCH_PATHS'] === INHERITED) {
13541390
buildSettings['FRAMEWORK_SEARCH_PATHS'] = [INHERITED];
13551391
}
1356-
1357-
buildSettings['FRAMEWORK_SEARCH_PATHS'].push(searchPathForFile(file, this));
1392+
var searchPath = searchPathForFile(file, this);
1393+
if(buildSettings['FRAMEWORK_SEARCH_PATHS'].indexOf(searchPath) < 0){
1394+
buildSettings['FRAMEWORK_SEARCH_PATHS'].push(searchPath);
1395+
}
13581396
}
13591397
}
13601398

@@ -1565,6 +1603,19 @@ pbxProject.prototype.hasFile = function(filePath) {
15651603
return false;
15661604
}
15671605

1606+
pbxProject.prototype.getFileKey = function(filePath) {
1607+
var files = nonComments(this.pbxFileReferenceSection()),
1608+
file, id;
1609+
for (id in files) {
1610+
file = files[id];
1611+
if (file.path == filePath || file.path == ('"' + filePath + '"')) {
1612+
return id;
1613+
}
1614+
}
1615+
1616+
return false;
1617+
}
1618+
15681619
pbxProject.prototype.addTarget = function(name, type, subfolder) {
15691620

15701621
// Setup uuid and name of new target

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"name": "nativescript-dev-xcode",
44
"description": "parser for xcodeproj/project.pbxproj files",
55
"main": "index.js",
6-
"version": "0.1.0",
6+
"version": "0.2.0",
77
"repository": {
88
"url": "https://github.com/NativeScript/nativescript-dev-xcode.git"
99
},

test/addFramework.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,20 @@ exports.addFramework = {
188188
test.done();
189189
},
190190
'duplicate entries': {
191-
'should return false': function (test) {
191+
'should return same build file': function (test) {
192192
var newFile = proj.addFramework('libsqlite3.dylib');
193+
var sameFile = proj.addFramework('libsqlite3.dylib');
193194

194-
test.ok(!proj.addFramework('libsqlite3.dylib'));
195+
test.equal(newFile.uuid, sameFile.uuid);
196+
test.equal(newFile.fileRef, sameFile.fileRef);
197+
test.done();
198+
},
199+
'should return different build file with same ref for different target': function (test) {
200+
var newFile = proj.addFramework('libsqlite3.dylib');
201+
var differentFile = proj.addFramework('libsqlite3.dylib', { target: "1D6058900D05DD3D006BFB54"});
202+
203+
test.notEqual(newFile.uuid, differentFile.uuid);
204+
test.equal(newFile.fileRef, differentFile.fileRef);
195205
test.done();
196206
}
197207
},

test/fixtures/full-project.json

+10-2
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,15 @@
564564
],
565565
"runOnlyForDeploymentPostprocessing": 0
566566
},
567-
"1D60588F0D05DD3D006BFB54_comment": "Frameworks"
567+
"1D60588F0D05DD3D006BFB54_comment": "Frameworks",
568+
"2D60588F0D05DD3D006BFB55": {
569+
"isa": "PBXFrameworksBuildPhase",
570+
"buildActionMask": 2147483647,
571+
"files": [
572+
],
573+
"runOnlyForDeploymentPostprocessing": 0
574+
},
575+
"2D60588F0D05DD3D006BFB55_comment": "Frameworks"
568576
},
569577
"PBXGroup": {
570578
"080E96DDFE201D6D7F000001": {
@@ -866,7 +874,7 @@
866874
"comment": "Sources"
867875
},
868876
{
869-
"value": "1D60588F0D05DD3D006BFB54",
877+
"value": "2D60588F0D05DD3D006BFB55",
870878
"comment": "Frameworks"
871879
}
872880
],

0 commit comments

Comments
 (0)