草庐IT

swift - 在 generate-xcodeproj 之后,哪些步骤可以将 SPM 生成的 Xcode 项目静态链接为另一个 Xcode 项目中的子项目?

coder 2023-09-11 原文

动机: 能够生成一个基于 SPM 的静态库 Xcode 项目会很有用 referenced from another (not SPM-base) Xcode project . generate-xcodeproj 似乎是一种合理的尝试方法,但是,generate-xcodeproj 创建的是一个动态框架项目而不是静态库项目。

问题:在generate-xcodeproj之后,需要哪些Xcode步骤(对于Xcode 9和Swift 4)来静态链接一个type: .static Swift Package Library 变成一个简单的命令行二进制可执行文件……类似于相应的 swift build 生成的内容?

换句话说,如何最终得到一个 SPM 生成的静态库 Xcode 项目,该项目可以用作非 SPM Xcode 项目中的子项目。

目标使用 Xcode 生成一个静态链接的可执行文件,就像 swift build 从命令行 生成的一样......对于相同的模块产品。

问题是 generate-xcodeproj 生成的项目创建了一个动态链接的产品(不是预期的),而 swift build 生成了一个静态链接的产品(如预期的那样)。

示例:考虑两个 Swift Manager Packages (SPM) 包:

  1. 静态库:TinkerEvalStaticLibswift package init --type library 为起点。
  2. 命令行可执行文件:TinkerEvalStaticCliswift package init --type executable 作为起点。

TinkerEvalStaticLib 很简单,明确设置为 .static 类型。

TinkerEvalStaticLib.swift

public class TinkerEvalStaticLib {
    public static func printSomething() -> String {
        let s = "Library says, 'Hello.'"
        print(s)
        return s
    }
} 

Package.swift

…
products: [
    .library(name: "TinkerEvalStaticLib", 
    type: .static, // expressly set to be a static library
    …

TinkerEvalStaticCli 也很简单,并且有 TinkerEvalStaticLib 作为依赖项。

main.swift

import TinkerEvalStaticLib
let _ = TinkerEvalStaticLib.printSomething() 

Package.swift

…
name: "TinkerEvalStaticCli",
dependencies: [
  .package(
    url: "git@github.com:VaporExamplesLab/TinkerEvalStaticLib.git",
    .branch("master") ),
],
…

观察:

  1. TinkerEvalStaticCli 目录中,swift build 将创建一个独立的可重定位、静态链接的可执行文件。
prompt> ./TinkerEvalStaticCli_spm 
Library says, 'Hello.'
  1. 但是,使用 swift package generate-xcodeproj 创建的 Xcode 项目会创建一个需要单独库的动态链接可执行文件。
prompt> ./TinkerEvalStaticCli_xc 
dyld: Library not loaded: @rpath/TinkerEvalStaticLib.framework/Versions/A/TinkerEvalStaticLib
  Referenced from: /Users/…/./TinkerEvalStaticCli_xc
  Reason: image not found
Abort trap: 6

注意:人们会期望 swift package generate-xcodeproj 生成的 Xcode 项目会构建一个类似于静态链接的二进制文件(而不是动态链接的二进制文件)由相应的 swift build 生成的链接二进制文件。因此,这个问题是针对当前 SPM generate-xcodeproj 限制的解决方法。

最佳答案

Swift 包模型不是与 Xcode 模型的一对一映射,因此存在一些差异。 generate-xcodeproj 命令适用于喜欢在 Xcode IDE 中工作的开发人员。也就是说,我们确实需要将生成的 Xcode 项目从框架移动到静态库,以便有更多相似之处。

我建议使用 swift build 来创建实际的静态链接二进制文件。

关于swift - 在 generate-xcodeproj 之后,哪些步骤可以将 SPM 生成的 Xcode 项目静态链接为另一个 Xcode 项目中的子项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48363996/

有关swift - 在 generate-xcodeproj 之后,哪些步骤可以将 SPM 生成的 Xcode 项目静态链接为另一个 Xcode 项目中的子项目?的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  7. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

随机推荐