Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift";“打印”;不';当在ECS上的docker中运行时,不会在标准输出中出现,但第三方c库日志会出现_Swift_Docker_Amazon Ecs_Swift Package Manager - Fatal编程技术网

swift";“打印”;不';当在ECS上的docker中运行时,不会在标准输出中出现,但第三方c库日志会出现

swift";“打印”;不';当在ECS上的docker中运行时,不会在标准输出中出现,但第三方c库日志会出现,swift,docker,amazon-ecs,swift-package-manager,Swift,Docker,Amazon Ecs,Swift Package Manager,因此,当通过xcode在dev中或使用SPM编译时,本地控制台日志会按预期显示 i、 e使用SPM本地一切正常 swift build --configuration release .build/release/Myapp # prints to console 但是,当我通过运行在ECS(我想是linux)上的docker容器运行可执行文件时,我看不到Swift代码生成的日志,但我确实看到第三方库打印stderr(即libssl打印错误)以及启动应用程序时的shell日志 例如: Doc

因此,当通过
xcode
在dev中或使用
SPM
编译时,本地控制台日志会按预期显示

i、 e使用
SPM
本地一切正常

swift build --configuration release 
.build/release/Myapp # prints to console
但是,当我通过运行在ECS(我想是linux)上的docker容器运行可执行文件时,我看不到Swift代码生成的日志,但我确实看到第三方库打印stderr(即libssl打印错误)以及启动应用程序时的shell日志

例如:

Dockerfile

FROM swift
WORKDIR /app

COPY Package.swift ./
COPY Sources ./Sources
COPY Tests ./Tests
RUN swift package clean
RUN swift build --configuration release
RUN chmod +x start.sh
CMD ["start.sh"] # just a wrapper to see if "echo" works
在start.sh中

# prints as expected
echo "hi this will print"
# nothing in the executable will print though
.build/release/MyApp


我不知道为什么它没有显示在标准输出中,但您可以这样做:

<代码>导入基础 内部结构FileHandleOutputStream:TextOutputStream{ 私有let fileHandle:fileHandle let编码:String.encoding init(fileHandle:fileHandle,编码:String.encoding=.utf8){ self.fileHandle=fileHandle self.encoding=编码 } 变异函数写入(uString:string){ 如果let data=string.data(使用:编码){ fileHandle.write(数据) } } } 内部变量STDERR=FileHandleOutputStream(.standardError) 内部变量STDOUT=FileHandleOutputStream(.standardOutput) 它允许您执行以下操作:

打印(“错误消息”,收件人:&STDERR)
打印到标准错误


我知道这只是一个解决办法,但它可能比什么都没有好。

我不知道为什么它没有显示在标准输出中,但您可以这样做:

<代码>导入基础 内部结构FileHandleOutputStream:TextOutputStream{ 私有let fileHandle:fileHandle let编码:String.encoding init(fileHandle:fileHandle,编码:String.encoding=.utf8){ self.fileHandle=fileHandle self.encoding=编码 } 变异函数写入(uString:string){ 如果let data=string.data(使用:编码){ fileHandle.write(数据) } } } 内部变量STDERR=FileHandleOutputStream(.standardError) 内部变量STDOUT=FileHandleOutputStream(.standardOutput) 它允许您执行以下操作:

打印(“错误消息”,收件人:&STDERR)
打印到标准错误


我知道这只是一个解决办法,但可能总比什么都没有好。

也有同样的问题,我提交了一个雷达,苹果回答:

当通过管道传输到另一个进程时,打印将被缓冲,因此在缓冲区填满之前不会显示任何字符。(当通过管道传输到终端时,我们只需缓冲,直到到达新行。)

通过在启动时调用
setbuf(stdout,nil)
一次,可以获得所需的行为:


同样的问题,我提交了雷达,苹果公司回答:

当通过管道传输到另一个进程时,打印将被缓冲,因此在缓冲区填满之前不会显示任何字符。(当通过管道传输到终端时,我们只需缓冲,直到到达新行。)

通过在启动时调用
setbuf(stdout,nil)
一次,可以获得所需的行为:


有了这段代码,您将覆盖所有打印,这样它就可以在Linux和Mac Xcode上工作。 我使用了@sam的响应并添加了覆盖打印

import Foundation

internal var STDERR = FileHandleOutputStream(.standardError)
internal var STDOUT = FileHandleOutputStream(.standardOutput)

internal struct FileHandleOutputStream: TextOutputStream {
    private let fileHandle: FileHandle
    let encoding: String.Encoding

    init(_ fileHandle: FileHandle, encoding: String.Encoding = .utf8) {
        self.fileHandle = fileHandle
        self.encoding = encoding
    }

    mutating func write(_ string: String) {
        if let data = string.data(using: encoding) {
            fileHandle.write(data)
        }
    }
}

///
/// Override of the print so it can work with Linux and MAC
/// https://stackoverflow.com/questions/39026752/swift-extending-functionality-of-print-function
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    
    let output = items.map { "\($0)" }.joined(separator: separator)
    
    #if os(Linux)
        print(output, to: &STDERR)
    #else
        Swift.print(output, terminator: terminator)
    #endif
}

有了这段代码,您将覆盖所有打印,这样它就可以在Linux和Mac Xcode上工作。 我使用了@sam的响应并添加了覆盖打印

import Foundation

internal var STDERR = FileHandleOutputStream(.standardError)
internal var STDOUT = FileHandleOutputStream(.standardOutput)

internal struct FileHandleOutputStream: TextOutputStream {
    private let fileHandle: FileHandle
    let encoding: String.Encoding

    init(_ fileHandle: FileHandle, encoding: String.Encoding = .utf8) {
        self.fileHandle = fileHandle
        self.encoding = encoding
    }

    mutating func write(_ string: String) {
        if let data = string.data(using: encoding) {
            fileHandle.write(data)
        }
    }
}

///
/// Override of the print so it can work with Linux and MAC
/// https://stackoverflow.com/questions/39026752/swift-extending-functionality-of-print-function
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    
    let output = items.map { "\($0)" }.joined(separator: separator)
    
    #if os(Linux)
        print(output, to: &STDERR)
    #else
        Swift.print(output, terminator: terminator)
    #endif
}

没有码头工人也有同样的问题。只需运行
swift run…
即可按预期打印所有内容,但使用
swift run…>out.txt 2>err.txt
一切都停止工作
FileHandleOutputStream
该作业是否在没有任何Docker的情况下存在相同的问题。只需运行
swift run…
即可按预期打印所有内容,但使用
swift run…>out.txt 2>err.txt
一切都停止工作
FileHandleOutputStream
完成了该工作