我们有一个生活在using System;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Runtime.InteropServices;
using System.Threading;
namespace RedirectDllOutput
{
class Program
{
[DllImport("..\\..\\..\\..\\x64\\Debug\\NativeDll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void main();
[DllImport("Kernel32.dll", SetLastError = true)]
static extern int SetStdHandle(int device, IntPtr handle);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
private static int STD_OUTPUT_HANDLE = -11;
static void Main(string[] args)
{
Do1();
Do1();
}
private static void Do1()
{
int id = Process.GetCurrentProcess()
.Id;
using (var serverPipe = new NamedPipeServerStream("consoleRedirect" + id, PipeDirection.In, 1))
using (var clientPipe = new NamedPipeClientStream(".", "consoleRedirect" + id, PipeDirection.Out, PipeOptions.WriteThrough))
{
ThreadPool.QueueUserWorkItem(
state =>
{
serverPipe.WaitForConnection();
using (var stm = new StreamReader(serverPipe))
{
while (serverPipe.IsConnected)
{
try
{
var txt = stm.ReadLine();
if (!string.IsNullOrEmpty(txt))
{
// Console.WriteLine(txt);
}
}
catch (IOException)
{
break;
}
}
}
},
null);
clientPipe.Connect();
var prevStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
var newStdHandle = new HandleRef(clientPipe, clientPipe.SafePipeHandle.DangerousGetHandle());
var stdHandle = SetStdHandle(STD_OUTPUT_HANDLE, newStdHandle.Handle);
main();
var handle = SetStdHandle(STD_OUTPUT_HANDLE, prevStdHandle);
clientPipe.WaitForPipeDrain();
clientPipe.Close();
serverPipe.Close();
}
}
}
}
的打字稿应用程序。我们有/src
的测试版。在本地,当我们运行TSC时,它会编译两者并将它们分别存入/tests
和/dist/src
。
我们还有一个Dockerconfig,它告诉docker忽略一堆dev文件,包括/dist/test
。当Docker运行/tests
时,它只会看到tsc
,因此会将所有/src
存放到/src
- 这意味着当我们拥有 - 例如 - / services时在本地编译为/dist
的文件夹;我们在容器中的/dist/src/services/whatever.js
处看到它。
我们的dockerfiles很小,它们只运行TSC并设置入口点。我们需要更清楚地使用dockerfiles吗?这是人们找到优雅解决方案的问题吗?
答案 0 :(得分:0)
如果不确切地知道正在装载什么目录,以及docker容器中的位置,这很难说,但这听起来像是一个应该用tsconfig.json
来解决的问题,可能有一些创造性的用途必要时使用docker文件。
例如,我有tsc
的dockerfile,它看起来像这样:
FROM alpine:latest
RUN apk update && apk add nodejs && rm -rf /var/cache/apk/*
RUN npm install -g typescript@~1.6
RUN mkdir /tsc
WORKDIR /tsc
ENTRYPOINT ["tsc"]
此容器将按如下方式执行:
docker run tsc -v "./:/tsc"
如果我的目录树看起来像这样:
.
├── tsconfig.json
├── dist
├── src
├── test
然后我看到了tsconfig.json
的几种不同的可能性:
{
"compilerOptions": {
"rootDir": "src",
"outDir": "dist/src"
}
}
OR
{
"exclude": ["test"]
}