Skip to content

Commit 127ca92

Browse files
Use xcworkspace instead of xcodeproj if path is xcworkpace
1 parent 928b8a3 commit 127ca92

File tree

5 files changed

+189
-27
lines changed

5 files changed

+189
-27
lines changed

step/platform.go

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import (
66
"strings"
77

88
"github.com/bitrise-io/go-utils/v2/log"
9+
"github.com/bitrise-io/go-xcode/xcodebuild"
910
"github.com/bitrise-io/go-xcode/xcodeproject/schemeint"
1011
"github.com/bitrise-io/go-xcode/xcodeproject/serialized"
1112
"github.com/bitrise-io/go-xcode/xcodeproject/xcodeproj"
1213
"github.com/bitrise-io/go-xcode/xcodeproject/xcscheme"
14+
"github.com/bitrise-io/go-xcode/xcodeproject/xcworkspace"
1315
)
1416

1517
type Platform string
@@ -23,6 +25,44 @@ const (
2325
visionOS Platform = "visionOS"
2426
)
2527

28+
// ArchivableProject represents either a workspace or a project that can be archived
29+
type ArchivableProject interface {
30+
BuildSettings(scheme, configuration string, customOptions ...string) (serialized.Object, error)
31+
GetProject() (*xcodeproj.XcodeProj, error)
32+
}
33+
34+
// WorkspaceProject wraps a workspace and its main project
35+
type WorkspaceProject struct {
36+
Workspace xcworkspace.Workspace
37+
XcodeProj *xcodeproj.XcodeProj
38+
}
39+
40+
func (w WorkspaceProject) BuildSettings(scheme, configuration string, customOptions ...string) (serialized.Object, error) {
41+
return w.Workspace.SchemeBuildSettings(scheme, configuration, customOptions...)
42+
}
43+
44+
func (w WorkspaceProject) GetProject() (*xcodeproj.XcodeProj, error) {
45+
return w.XcodeProj, nil
46+
}
47+
48+
// XcodeProjWrapper wraps a standalone project
49+
type XcodeProjWrapper struct {
50+
XcodeProj *xcodeproj.XcodeProj
51+
}
52+
53+
func (p XcodeProjWrapper) BuildSettings(scheme, configuration string, customOptions ...string) (serialized.Object, error) {
54+
// For xcodeproj projects, use xcodebuild command directly with the project path
55+
commandModel := xcodebuild.NewShowBuildSettingsCommand(p.XcodeProj.Path)
56+
commandModel.SetScheme(scheme)
57+
commandModel.SetConfiguration(configuration)
58+
commandModel.SetCustomOptions(customOptions)
59+
return commandModel.RunAndReturnSettings()
60+
}
61+
62+
func (p XcodeProjWrapper) GetProject() (*xcodeproj.XcodeProj, error) {
63+
return p.XcodeProj, nil
64+
}
65+
2666
func parsePlatform(platform string) (Platform, error) {
2767
switch strings.ToLower(platform) {
2868
case "detect":
@@ -40,7 +80,7 @@ func parsePlatform(platform string) (Platform, error) {
4080
}
4181
}
4282

43-
func OpenArchivableProject(pth, schemeName, configurationName string) (*xcodeproj.XcodeProj, *xcscheme.Scheme, string, error) {
83+
func OpenArchivableProject(pth, schemeName, configurationName string) (ArchivableProject, *xcscheme.Scheme, string, error) {
4484
scheme, schemeContainerDir, err := schemeint.Scheme(pth, schemeName)
4585
if err != nil {
4686
return nil, nil, "", fmt.Errorf("could not get scheme (%s) from path (%s): %s", schemeName, pth, err)
@@ -67,41 +107,56 @@ func OpenArchivableProject(pth, schemeName, configurationName string) (*xcodepro
67107
if err != nil {
68108
return nil, nil, "", err
69109
}
70-
return &xcodeProj, scheme, configurationName, nil
110+
111+
// Check if the original path is a workspace
112+
if strings.HasSuffix(pth, xcworkspace.XCWorkspaceExtension) {
113+
workspace, err := xcworkspace.Open(pth)
114+
if err != nil {
115+
return nil, nil, "", fmt.Errorf("failed to open workspace: %s", err)
116+
}
117+
return WorkspaceProject{Workspace: workspace, XcodeProj: &xcodeProj}, scheme, configurationName, nil
118+
}
119+
120+
// Otherwise it's a standalone project
121+
return XcodeProjWrapper{XcodeProj: &xcodeProj}, scheme, configurationName, nil
71122
}
72123

73-
type TargetBuildSettingsProvider interface {
74-
TargetBuildSettings(xcodeProj *xcodeproj.XcodeProj, target, configuration string, customOptions ...string) (serialized.Object, error)
124+
type BuildSettingsProvider interface {
125+
BuildSettings(archivableProject ArchivableProject, schemeName, target, configuration string, customOptions ...string) (serialized.Object, error)
75126
}
76127

77128
type XcodeBuild struct {
78129
}
79130

80-
func (x XcodeBuild) TargetBuildSettings(xcodeProj *xcodeproj.XcodeProj, target, configuration string, customOptions ...string) (serialized.Object, error) {
81-
return xcodeProj.TargetBuildSettings(target, configuration, customOptions...)
131+
func (x XcodeBuild) BuildSettings(archivableProject ArchivableProject, schemeName, target, configuration string, customOptions ...string) (serialized.Object, error) {
132+
// Use the archivable project's scheme build settings method
133+
return archivableProject.BuildSettings(schemeName, configuration, customOptions...)
82134
}
83135

84136
func BuildableTargetPlatform(
85-
xcodeProj *xcodeproj.XcodeProj,
137+
archivableProject ArchivableProject,
86138
scheme *xcscheme.Scheme,
87139
configurationName string,
88140
additionalOptions []string,
89-
provider TargetBuildSettingsProvider,
141+
provider BuildSettingsProvider,
90142
logger log.Logger,
91143
) (Platform, error) {
92-
logger.Printf("Finding platform type")
93-
94144
archiveEntry, ok := scheme.AppBuildActionEntry()
95145
if !ok {
96-
return "", fmt.Errorf("archivable entry not found in project: %s, scheme: %s", xcodeProj.Path, scheme.Name)
146+
return "", fmt.Errorf("archivable entry not found in scheme: %s", scheme.Name)
147+
}
148+
149+
xcodeProj, err := archivableProject.GetProject()
150+
if err != nil {
151+
return "", fmt.Errorf("failed to get project: %s", err)
97152
}
98153

99154
mainTarget, ok := xcodeProj.Proj.Target(archiveEntry.BuildableReference.BlueprintIdentifier)
100155
if !ok {
101156
return "", fmt.Errorf("target not found: %s", archiveEntry.BuildableReference.BlueprintIdentifier)
102157
}
103158

104-
settings, err := provider.TargetBuildSettings(xcodeProj, mainTarget.Name, configurationName, additionalOptions...)
159+
settings, err := provider.BuildSettings(archivableProject, scheme.Name, mainTarget.Name, configurationName, additionalOptions...)
105160
if err != nil {
106161
return "", fmt.Errorf("failed to get target (%s) build settings: %s", mainTarget.Name, err)
107162
}

step/platform_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ type MockTargetBuildSettingsProvider struct {
1515
mock.Mock
1616
}
1717

18-
// TargetBuildSettings ...
19-
func (m *MockTargetBuildSettingsProvider) TargetBuildSettings(xcodeProj *xcodeproj.XcodeProj, target, configuration string, customOptions ...string) (serialized.Object, error) {
20-
args := m.Called(xcodeProj, target, configuration)
18+
// BuildSettings ...
19+
func (m *MockTargetBuildSettingsProvider) BuildSettings(archivableProject ArchivableProject, schemeName, target, configuration string, customOptions ...string) (serialized.Object, error) {
20+
args := m.Called(archivableProject, schemeName, target, configuration)
2121
return args.Get(0).(serialized.Object), args.Error(1)
2222
}
2323

@@ -94,10 +94,11 @@ func TestBuildableTargetPlatform(t *testing.T) {
9494
t.Run(tt.name, func(t *testing.T) {
9595
provider := &MockTargetBuildSettingsProvider{}
9696
provider.
97-
On("TargetBuildSettings", mock.AnythingOfType("*xcodeproj.XcodeProj"), mock.AnythingOfType("string"), mock.AnythingOfType("string")).
97+
On("BuildSettings", mock.AnythingOfType("step.XcodeProjWrapper"), mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("string")).
9898
Return(tt.settings, nil)
9999

100-
got, err := BuildableTargetPlatform(tt.xcodeProj, tt.scheme, tt.configurationName, []string{}, provider, log.NewLogger())
100+
archivableProject := XcodeProjWrapper{XcodeProj: tt.xcodeProj}
101+
got, err := BuildableTargetPlatform(archivableProject, tt.scheme, tt.configurationName, []string{}, provider, log.NewLogger())
101102
if (err != nil) != tt.wantErr {
102103
t.Errorf("BuildableTargetPlatform() error = %v, wantErr %v", err, tt.wantErr)
103104
return

step/step.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -818,7 +818,7 @@ func (s XcodebuildArchiver) xcodeArchive(opts xcodeArchiveOpts) (xcodeArchiveRes
818818
// Open Xcode project
819819
s.logger.TInfof("Opening xcode project at path: %s for scheme: %s", opts.ProjectPath, opts.Scheme)
820820

821-
xcodeProj, scheme, configuration, err := OpenArchivableProject(opts.ProjectPath, opts.Scheme, opts.Configuration)
821+
archivableProject, scheme, configuration, err := OpenArchivableProject(opts.ProjectPath, opts.Scheme, opts.Configuration)
822822
if err != nil {
823823
return out, fmt.Errorf("failed to open project: %s: %s", opts.ProjectPath, err)
824824
}
@@ -828,7 +828,7 @@ func (s XcodebuildArchiver) xcodeArchive(opts xcodeArchiveOpts) (xcodeArchiveRes
828828
if opts.DestinationPlatform == detectPlatform {
829829
s.logger.TInfof("Platform is set to 'automatic', detecting platform from the project.")
830830
s.logger.TWarnf("Define the platform step input manually to avoid this phase in the future.")
831-
platform, err := BuildableTargetPlatform(xcodeProj, scheme, configuration, opts.AdditionalOptions, XcodeBuild{}, s.logger)
831+
platform, err := BuildableTargetPlatform(archivableProject, scheme, configuration, opts.AdditionalOptions, XcodeBuild{}, s.logger)
832832
if err != nil {
833833
return out, fmt.Errorf("failed to read project platform: %s: %s", opts.ProjectPath, err)
834834
}
@@ -837,6 +837,11 @@ func (s XcodebuildArchiver) xcodeArchive(opts xcodeArchiveOpts) (xcodeArchiveRes
837837

838838
s.logger.TInfof("Reading main target")
839839

840+
// Get the underlying XcodeProj for exportoptionsgenerator
841+
xcodeProj, err := archivableProject.GetProject()
842+
if err != nil {
843+
return out, fmt.Errorf("failed to get underlying project: %s", err)
844+
}
840845
mainTarget, err := exportoptionsgenerator.ArchivableApplicationTarget(xcodeProj, scheme)
841846
if err != nil {
842847
return out, fmt.Errorf("failed to read main application target: %s", err)

vendor/github.com/bitrise-io/go-xcode/v2/autocodesign/projectmanager/projecthelper.go

Lines changed: 82 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/bitrise-io/go-xcode/xcodeproject/xcworkspace/xcworkspace.go

Lines changed: 27 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)