我仍然不了解appengine模块的部署过程。我的应用程序有三个模块,我可以独立更新和部署。
我刚注意到虽然我在app.yaml中为我的默认模块声明了skip_files
,但我的自定义模块仍在部署所有内容。所以我将指令从app.yaml复制粘贴到自定义YAML文件中。虽然我认为不需要经常更换这些,但我仍然希望尽可能地干燥。
有没有办法定义skip_files
一次并继承或引用这些指令?
答案 0 :(得分:2)
GAE将每个模块视为一个独立的独立应用程序,每个应用程序都在自己的实例中运行。模块之间的GAE infra级别不共享应用程序可上载工件。出于这个原因,如果我理解的话,甚至可以混合用不同语言编写的模块。
在DRY
精神应用程序的文件或目录中,可以"共享"在源代码级别的模块之间通过将文件/目录的单个源副本符号链接到所有模块中。将应用程序部署到GAE后,部署实用程序将使用实际的符号链接目标内容替换为符号链接。
然而,符号链接方法不适用于文件级别以下的共享,例如文件中的部分。 DRY仍可应用于GAE基础设施支持的选择部分配置文件明确。
根据the documentation,skip_files
部分恰好是此类受支持的部分之一:
includes指令允许您包含配置文件 适用于整个应用程序中的任何库或模块。例如, 您可以包含用户管理库,如下所示:
includes: - lib/user_admin.yaml
...和...
使用includes仅检索以下类型的指令 目标文件(如果存在):
- 建宏
- 包括
- 处理程序
- 的 skip_files 强>
基于此我想想您可以在应用的顶级目录中添加app_shared.yaml
文件,其中包含您的skip_files
模式(小心覆盖默认设置) ,BTW)然后你可以将它们包含在你的模块中。 .yaml
个文件:
includes:
- app_shared.yaml
您可能需要将app_shared.yaml
符号链接到每个模块的目录(上述DRY方法)中,如果这些模块位于模块中的话。 .yaml
中建议存在 Runnable serverTask = new Runnable()
{
@Override
public void run()
{
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(DEFAULT_PORT);
serverSocket.setReuseAddress(true);
_working = true;
while (_working)
{
Socket clientSocket = serverSocket.accept();
clientSocket.setSoTimeout(10000);
clientProcessingPool.submit(new ClientTask(clientSocket));
}
}
catch (IOException e)
{
System.err.println("Unable to process client request");
e.printStackTrace();
}
finally
{
try
{
if (serverSocket != null)
{
serverSocket.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
private class ClientTask implements Runnable
{
private final Socket clientSocket;
private ClientTask(Socket clientSocket)
{
this.clientSocket = clientSocket;
}
@Override
public void run()
{
System.out.println("Got a client !");
try
{
System.out.println("Connected!");
DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream());
DataInputStream dIn = new DataInputStream(clientSocket.getInputStream());
String request = dIn.readUTF();
parseRequest(request);
System.out.println("request=" + request);
dOut.writeUTF("Got the command");
dOut.flush(); // Send off the data
dIn.close();
dOut.close();
clientSocket.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
个文件。
注意:我自己并没有真正使用包含方法,答案完全基于文档。