es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Xcode no puede encontrar el módulo de mi objetivo después de haber cambiado el nombre del ejecutable en Package.swift.

Quería cambiar el nombre del ejecutable producido por mi proyecto del Administrador de Paquetes Swift. Siguiendo esta respuesta, ahora mi Package.swift se ve así:

let package = Package(
    name: "Foo", // mi paquete se llama "Foo"...
    products: [
        // y quiero que mi ejecutable se llame "bar"
        .executable(name: "bar", targets: ["Foo"])
    ],
    targets: [
        .executableTarget(
            name: "Foo",
            dependencies: []),
        .testTarget(
            name: "FooTests",
            dependencies: ["Foo"]),
    ]
)

En main.swift en el objetivo “Foo”, he escrito una función para probar en el objetivo “FooTests”:

// en main.swift
func foo() -> Int {
    1
}

// en FooTests.swift
import XCTest
@testable import Foo

final class FooTests: XCTestCase {
    func testFoo() throws {
        XCTAssertEqual(foo(), 1)
    }
}

Si compilo el proyecto presionando comandante + B en este punto, Xcode se quejaría de que el módulo “Foo” no se puede encontrar, resaltando la línea “@testable import” en FooTests.swift. También dice que el método “foo” no se puede encontrar en el ámbito.

Estoy bastante confundido. Solo he cambiado el nombre del ejecutable, no el nombre del módulo (que creo que es el mismo que el nombre del objetivo).

Intenté ejecutar esto en la línea de comandos con “swift test”, y funciona perfectamente.

También he probado con “@testable import bar” (porque podría intentarlo), y el mensaje de error cambia a:

Símbolo no definido: bar.foo() -> Swift.Int

¿Cómo puedo solucionar esto? Aún quiero usar Xcode para probar mi proyecto. Después de todo, una gran característica de XCTest es que está integrado de manera excelente con Xcode.

Tenga en cuenta que estoy usando Xcode 13.1 y estoy abriendo el proyecto del Administrador de Paquetes Swift abriendo la carpeta que contiene Package.swift con Xcode.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar este problema, debes actualizar la instrucción de importación en FooTests.swift para importar el nombre ejecutable “bar” en lugar del nombre del paquete “Foo”. Entonces, reemplaza:

    @testable import Foo
    

    con:

    @testable import bar
    

    Esto se debe a que el ejecutable ahora se llama “bar”, por lo que necesitas importar ese módulo en su lugar.

    Luego, en main.swift, debes actualizar la definición de la función para que esté dentro del objetivo “bar” en lugar del objetivo “Foo”. Entonces, reemplaza:

    func foo() -> Int {
        1
    }
    

    con:

    public func foo() -> Int {
        1
    }
    

    Esto agrega el modificador de acceso “public” a la función, haciéndola visible para otros módulos, incluido el objetivo “bar”.

    Después de hacer estos cambios, Xcode ya no debería mostrar errores relacionados con la falta de módulo o función. Puedes construir y probar el proyecto usando Xcode como antes.

Comments are closed.