如何使用 Swift 包管理器从 repo 中排除文件/文件夹?

Posted

技术标签:

【中文标题】如何使用 Swift 包管理器从 repo 中排除文件/文件夹?【英文标题】:How can I exclude files/folders from repo with Swift Package Manager? 【发布时间】:2019-10-10 11:34:47 【问题描述】:

我的图书馆FlexColorPicker 最近采用了 SPM 支持。它可以工作,但我不喜欢通过 Xcode 添加 FlexColorPicker 包时,会下载一些不需要的文件。例如,FlexColorPicker.podspec 和整个 GifsAndScreenshots 文件夹。

有没有办法防止下载这些不必要的文件?

使用 Xcode 添加包:File → Swift Packages → Add Package Dependency... → 选择目标 → 输入 https://github.com/RastislavMirek/FlexColorPicker → 确认

【问题讨论】:

你好!我一直并且仍然处于确切的情况。就像您提到的那样,我现在使用点前缀。您找到解决此问题的适当方法了吗?谢谢。 【参考方案1】:

您可以在Package.swift 文件中的目标上使用exclude 参数来执行此操作。它接受一个路径数组(相对于目标根)。

来自docs:

/// Create a library or executable target.
///
/// A target can either contain Swift or C-family source files. You cannot
/// mix Swift and C-family source files within a target. A target is
/// considered to be an executable target if there is a `main.swift`,
/// `main.m`, `main.c` or `main.cpp` file in the target's directory. All
/// other targets are considered to be library targets.
///
/// - Parameters:
///   - name: The name of the target.
///   - dependencies: The dependencies of the target. These can either be other targets in the package or products from package dependencies.
///   - path: The custom path for the target. By default, targets will be looked up in the <package-root>/Sources/<target-name> directory.
///       Do not escape the package root, i.e. values like "../Foo" or "/Foo" are invalid.
///   - exclude: A list of paths to exclude from being considered source files. This path is relative to the target's directory.
///   - sources: An explicit list of source files.
///   - publicHeadersPath: The directory containing public headers of a C-family family library target.
///   - cSettings: The C settings for this target.
///   - cxxSettings: The C++ settings for this target.
///   - swiftSettings: The Swift settings for this target.
///   - linkerSettings: The linker settings for this target.
...

在 Package.swift 文件中使用它看起来像这样:

...
  targets: [
    // Targets are the basic building blocks of a package. A target can define a module or a test suite.
    // Targets can depend on other targets in this package, and on products in packages which this package depends on.
    .target(
      name: "MyApp",
      dependencies: [],
      exclude: ["example.swift"]
    ),
...

另外,developer.apple.com 也有一些docs for the target -> exclude parameter

【讨论】:

这不行 @InderKumarRathore 您可能正在使用太旧的包管理器。我认为您需要版本 5.x。您应该将Package.swift 中的版本调整为// swift-tools-version:5.0 或更高版本。 您可以尝试缩短您的 exclude 文件夹路径,使其不是从包根目录(也就是 Package.swift 所在的位置)开始,而是从目标根目录开始。刚刚为我工作。 这对于所提出的问题实际上不起作用。作者想阻止某些文件夹或文件与包一起下载。在这个回复中,即使我们排除了一个文件夹或文件,它们仍然会被下载到客户端的代码中。【参考方案2】:

目前这是不可能的。 SwiftPM 会克隆 git 存储库,因此它也会获取这些文件中的任何一个。

我知道 git 可以从存储库中克隆特定路径,但我不确定这些限制。要支持 SwiftPM 的此类功能,需要一个 Swift Evolution 提案。

【讨论】:

作为参考,至少可以在 XCode 浏览器中隐藏一些文件或文件夹,方法是在它们的名称前加上句点。

以上是关于如何使用 Swift 包管理器从 repo 中排除文件/文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 包管理器 - UIKit 依赖

如何在 Playground 中使用 Swift 包管理器

如何从源代码管理中排除 NuGet 内容

如何在 Swift 包中放置 swiftlint 配置文件?

使用 MS Office 图片管理器从 JPEG 图像中裁剪颜色

如何使用 Swift 包管理器 binaryTarget?