赞
踩
首先,需要一个私有的 Git 仓库来存放你的 Podspec 文件,这个仓库用于索引你所有的私有 Pods。
PrivatePodSpecs
。$ git clone https://github.com/yourusername/PrivatePodSpecs.git
一个私有 Spec 仓库可以包含多个组件库(Pods)。这是一个非常常见的做法,特别是在大型项目或组织中,将多个相关的私有库集中管理。这样做有几个优点:
优点:
- source 'https://gitee.com/fzym/private-pod-specs.git'
-
- platform :ios, '10.0'
-
- target 'GaminComponentDemo' do
- use_frameworks!
-
- pod 'MyComponent', '0.0.3'
- pod 'MyOtherComponent', '0.0.1'
-
- end
-
确保你的库的代码已经在一个可访问的 Git 仓库中(比如 GitHub 的私有仓库)。库中应该包含:
在你的库项目的根目录下,执行以下命令来创建一个基本的 Podspec 文件:
$ pod spec create YourLibrary
这将创建一个名为 YourLibrary.podspec
的文件,其中 YourLibrary
是你的库的名字。CocoaPods 会自动填充一些基本的模板内容到这个文件中。
- #
- # Be sure to run `pod spec lint MyComponent.podspec' to ensure this is a
- # valid spec and to remove all comments including this before submitting the spec.
- #
- # To learn more about Podspec attributes see https://guides.cocoapods.org/syntax/podspec.html
- # To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
- #
-
- Pod::Spec.new do |spec|
-
- # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # These will help people to find your library, and whilst it
- # can feel like a chore to fill in it's definitely to your advantage. The
- # summary should be tweet-length, and the description more in depth.
- #
-
- spec.name = "MyComponent"
- spec.version = "0.0.1"
- spec.summary = "A short description of MyComponent."
-
- # This description is used to generate tags and improve search results.
- # * Think: What does it do? Why did you write it? What is the focus?
- # * Try to keep it short, snappy and to the point.
- # * Write the description between the DESC delimiters below.
- # * Finally, don't worry about the indent, CocoaPods strips it!
- spec.description = <<-DESC
- DESC
-
- spec.homepage = "http://EXAMPLE/MyComponent"
- # spec.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"
-
-
- # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # Licensing your code is important. See https://choosealicense.com for more info.
- # CocoaPods will detect a license file if there is a named LICENSE*
- # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'.
- #
-
- spec.license = "MIT (example)"
- # spec.license = { :type => "MIT", :file => "FILE_LICENSE" }
-
-
- # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # Specify the authors of the library, with email addresses. Email addresses
- # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also
- # accepts just a name if you'd rather not provide an email address.
- #
- # Specify a social_media_url where others can refer to, for example a twitter
- # profile URL.
- #
-
- spec.author = { "" => "" }
- # Or just: spec.author = ""
- # spec.authors = { "" => "" }
- # spec.social_media_url = "https://twitter.com/"
-
- # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # If this Pod runs only on iOS or OS X, then specify the platform and
- # the deployment target. You can optionally include the target after the platform.
- #
-
- # spec.platform = :ios
- # spec.platform = :ios, "5.0"
-
- # When using multiple platforms
- # spec.ios.deployment_target = "5.0"
- # spec.osx.deployment_target = "10.7"
- # spec.watchos.deployment_target = "2.0"
- # spec.tvos.deployment_target = "9.0"
- # spec.visionos.deployment_target = "1.0"
-
-
- # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # Specify the location from where the source should be retrieved.
- # Supports git, hg, bzr, svn and HTTP.
- #
-
- spec.source = { :git => "http://EXAMPLE/MyComponent.git", :tag => "#{spec.version}" }
-
-
- # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # CocoaPods is smart about how it includes source code. For source files
- # giving a folder will include any swift, h, m, mm, c & cpp files.
- # For header files it will include any header in the folder.
- # Not including the public_header_files will make all headers public.
- #
-
- spec.source_files = "Classes", "Classes/**/*.{h,m}"
- spec.exclude_files = "Classes/Exclude"
-
- # spec.public_header_files = "Classes/**/*.h"
-
-
- # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # A list of resources included with the Pod. These are copied into the
- # target bundle with a build phase script. Anything else will be cleaned.
- # You can preserve files from being cleaned, please don't preserve
- # non-essential files like tests, examples and documentation.
- #
-
- # spec.resource = "icon.png"
- # spec.resources = "Resources/*.png"
-
- # spec.preserve_paths = "FilesToSave", "MoreFilesToSave"
-
-
- # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # Link your library with frameworks, or libraries. Libraries do not include
- # the lib prefix of their name.
- #
-
- # spec.framework = "SomeFramework"
- # spec.frameworks = "SomeFramework", "AnotherFramework"
-
- # spec.library = "iconv"
- # spec.libraries = "iconv", "xml2"
-
-
- # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
- #
- # If your library depends on compiler flags you can set them in the xcconfig hash
- # where they will only apply to your library. If you depend on other Podspecs
- # you can include multiple dependencies to ensure it works.
-
- # spec.requires_arc = true
-
- # spec.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
- # spec.dependency "JSONKit", "~> 1.4"
-
- end
打开 YourLibrary.podspec
文件,在编辑器中进行修改,以符合你的库的具体情况。以下是 Podspec 文件的一个例子及其解释:
- Pod::Spec.new do |s|
- s.name = "YourLibrary"
- s.version = "0.0.1"
- s.summary = "A short description of YourLibrary."
- s.description = <<-DESC
- An optional longer description of YourLibrary.
- DESC
- s.homepage = "http://example.com/YourLibrary"
- s.license = { :type => "MIT", :file => "LICENSE" }
- s.author = { "Your Name" => "you@example.com" }
- s.source = { :git => "https://github.com/yourusername/YourLibrary.git", :tag => "#{s.version}" }
- s.source_files = "Sources/**/*.{h,m,swift}"
- s.platform = :ios, '10.0'
- s.swift_version = '5.0'
-
- # 添加对 Moya 的依赖
- #s.dependency 'Moya', '~> 15.0.0'
- # 添加对 SwiftyJSON 的依赖
- #s.dependency 'SwiftyJSON', '5.0.1'
- end
.podspec
文件中连续添加多个 dependency
属性。每个依赖都应该以单独的 s.dependency
行来声明。这让您可以明确指定每个依赖库的名称和版本要求。MyComponent.podspec
文件中的 s.source
参数,确保其指向正确的 URL 和分支或标签。
先确保你的组件库有你配置这个分支或标签,然后你再配置分支的名称或tag。
标签(Tag):
标签是指向 Git 仓库中某一特定提交的引用,通常用于标记发布点(如版本发布)。标签是静态的,指向特定的提交,不会随着更多的提交而变化。
在 podspec
文件中使用标签,通常意味着你指定了一个稳定的、用于发布的版本。这是最常见的用法,因为这确保了项目的依赖是固定且可预测的。例如:
s.source = { :git => 'https://gitee.com/fzym/my-component.git', :tag => '0.0.1' }
分支(Branch):
分支是用于开发新功能、修复错误或进行实验而创建的代码的独立线路。创建分支可以让你在不影响主线(通常是 master
或 main
分支)的情况下开发和测试代码。
在 podspec
文件中指定分支,意味着 CocoaPods 将从这个特定分支拉取代码。这通常用于开发阶段,当你想要使用最新的尚未发布的代码时。
s.source = { :git => 'https://gitee.com/fzym/my-component.git', :branch => 'develop' }
这里,develop
分支可能包含最新的开发中的功能和修复。
在完成编辑后,你需要验证 Podspec 文件来确保配置无误:
$ pod lib lint
这个命令将检查你的 Podspec 文件是否有错误或者遗漏的必要信息。如果一切顺利,你将看到 "passed validation" 的消息。
一旦 Podspec 文件准备好并且验证通过,可以将其添加到你的私有 Spec 仓库:
- $ pod repo add PrivateRepoName https://github.com/yourusername/PrivatePodSpecs.git
- $ pod repo push PrivateRepoName YourLibrary.podspec
这里 PrivateRepoName
是你给你的私有 Spec 仓库设定的本地名称。
如果需要重命名仓库,你可以这样做:
- $ pod repo remove OldPrivateRepoName
- $ pod repo add NewPrivateRepoName https://github.com/yourusername/PrivatePodSpecs.git
如果你忘记了你为私有仓库设置的本地别名 PrivateRepoName
,你可以很容易地查看你的 CocoaPods 配置来找到所有已添加的私有仓库及其别名。这可以通过在终端运行一个简单的命令来完成。
$ pod repo list
在项目的 Podfile 中指定你的私有 Spec 仓库和库:
- # 私有 Specs 仓库
- source 'https://github.com/yourusername/PrivatePodSpecs.git'
- # 这是一个用于存储 CocoaPods 库的公共资源,并且是官方推荐的替代源,用来代替传统的 GitHub 基于的 Specs 仓库。
- source 'https://cdn.cocoapods.org/'
-
- platform :ios, '10.0'
-
- target 'YourTarget' do
- use_frameworks!
- pod 'YourLibrary', '~> 0.0.1'
- pod 'MyComponent', '0.0.1', :source => 'https://github.com/yourusername/PrivatePodSpecs.git'
-
-
- pod 'Toast-Swift', '5.0.1'
- end
然后运行:
$ pod install
安装依赖成功,但是运行报错:
error: Sandbox: rsync.samba(44912) deny(1) file-write-create /Users/gamin/Library/Developer/Xcode/DerivedData/GaminComponentDemo-fksconsdxioqokgfmgdlkdmudypx/Build/Products/Debug-iphonesimulator/GaminComponentDemo.app/Frameworks/MyComponent.framework/_CodeSignature (in target 'GaminComponentDemo' from project 'GaminComponentDemo')
error: Sandbox: rsync.samba(44913) deny(1) file-write-create /Users/gamin/Library/Developer/Xcode/DerivedData/GaminComponentDemo-fksconsdxioqokgfmgdlkdmudypx/Build/Products/Debug-iphonesimulator/GaminComponentDemo.app/Frameworks/MyComponent.framework/.Info.plist.IoLml8 (in target 'GaminComponentDemo' from project 'GaminComponentDemo')
error: Sandbox: rsync.samba(44913) deny(1) file-write-create /Users/gamin/Library/Developer/Xcode/DerivedData/GaminComponentDemo-fksconsdxioqokgfmgdlkdmudypx/Build/Products/Debug-iphonesimulator/GaminComponentDemo.app/Frameworks/MyComponent.framework/.MyComponent.HK9Aoa (in target 'GaminComponentDemo' from project 'GaminComponentDemo')
解决:
检查项目的构建设置中是否禁用了 ENABLE_USER_SCRIPT_SANDBOXING。
""
如果您想保持 ENABLE_USER_SCRIPT_SANDBOXING 启用来修复这个问题,应该将文件添加为输入和输出。
我使用脚本在构建信息 plist 文件中设置构建号。 我只需要将“${TARGET_BUILD_DIR}/${INFOPLIST_PATH}”设置为脚本的输出
构建设置 ENABLE_USER_SCRIPT_SANDBOXING 已在 Xcode 14 中添加,但在Xcode 15 中默认启用
来自 Xcode 14 发行说明:
现在,您可以使用 ENABLE_USER_SCRIPT_SANDBOXING 构建设置为 shell 脚本构建阶段启用沙箱。 沙箱会阻止对项目源根目录以及派生数据目录内的文件的访问,除非您将这些文件列为输入或输出。 启用后,如果脚本阶段尝试读取或写入未声明的依赖项,则构建会因沙箱冲突而失败,从而防止错误构建。
感谢 Daniel Jalket 的博客文章:Xcode 构建脚本沙盒 - https://indiestack.com/2023/06/xcode-build-script-sandboxing/
""
相关问题:
Xcode 15 beta build issues | Apple Developer Forums
Xcode Build Script Sandboxing | Indie Stack
当你需要更新你的库时:
$ pod repo push PrivateRepoName YourLibrary.podspec
pod update
来拉取最新版本。由于你的库和 Spec 仓库是私有的,确保只向需要的团队成员和合作者提供访问权限。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。