Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
如何在打包为WAR并部署在IBM Liberty上的Angular应用程序中读取配置文件以设置API URL_Angular_Typescript_Docker_Deployment_Websphere Liberty - Fatal编程技术网

如何在打包为WAR并部署在IBM Liberty上的Angular应用程序中读取配置文件以设置API URL

如何在打包为WAR并部署在IBM Liberty上的Angular应用程序中读取配置文件以设置API URL,angular,typescript,docker,deployment,websphere-liberty,Angular,Typescript,Docker,Deployment,Websphere Liberty,我已经运行了ng build--prod,并将/dist文件夹的内容复制到动态web项目的webapps文件夹中 然后,我尝试将此项目导出为.war文件,并将其部署到Liberty server上。挑战在于,我在环境.prod.ts中设置了API URL 因此,如果我需要更改API URL,我需要重新运行ng build并复制/dist的内容,然后作为.war导出 我已经尝试将API基本URL设置为window.location.origin,因为我们的Angular应用程序和微服务的基本URL

我已经运行了
ng build--prod
,并将
/dist
文件夹的内容复制到动态web项目的webapps文件夹中

然后,我尝试将此项目导出为
.war
文件,并将其部署到Liberty server上。挑战在于,我在
环境.prod.ts
中设置了API URL

因此,如果我需要更改API URL,我需要重新运行
ng build
并复制
/dist
的内容,然后作为
.war
导出

我已经尝试将API基本URL设置为
window.location.origin
,因为我们的Angular应用程序和微服务的基本URL是相同的

我们想要的是使API URL可以从外部进行配置。例如,我们创建了最终的.war文件,但当我们将其部署为docker上的容器时,我们会读取一些配置文件并将其设置为API URL。

1)您可以使用json文件进行配置,并将其添加到assets文件夹中,并从代码中引用这些文件以获取API,因此无需重新生成这些文件,只需在资源中替换内容文件,它就可以开箱即用

2) 您也可以使用动态导入,但在这种情况下,您将需要自定义生成包来处理您的文件。

1解决方案: 您可以在同一Dockerfile中包含ng构建、war文件创建和部署,从而在ng构建步骤之前直接设置
API\u URL
。但这将使您在每次更改
API\u URL
(据我所知,这就是您每次重新部署war时所做的事情)时重新构建一个容器

第二种解决方案: 所以我将对第一个解决方案做一些假设

根据您所说的,我假设您正在开发微服务体系结构。我还将假设您的所有微服务都是通过一个端点(即API网关)公开的

一个可能的解决方案是通过API网关公开一个固定端点,Angular应用程序将使用该网关获取
API\u URL
(例如:/API/URL)。这将解决所有问题,因为您可以使端点(/api/url)返回您想要的任何内容

您可以使其返回一个url,您可以从某个配置存储/微服务中获得该url,您可以在任何给定时间轻松修改该url


我能看到的唯一缺点是,你将依赖于该url使你的应用程序工作。这使得它成为一个单一的失败点。尽管在/api/url端点不起作用的情况下,您可以使用一些回退api来绕过这个问题。

因为您使用的是Liberty,所以您可以使用JAX-RS(JAX-RS教程)创建一个端点,从文件或环境变量中读取所需的基本url(您可以使用标准Java api或类似的东西)并将其作为响应返回。将其打包为
.war
文件的一部分

然后,在上,您的Angular应用程序可以向该端点发出请求(您将始终知道该端点的位置,因为它将是同一个窗口。Angular应用程序本身来自的位置,只是一个不同的上下文根和/或路径。)这将为它提供工作所需的信息。

您需要使用
--ng server
--public host
选项,如本文所述,因此最后
--public host$URL
其中$URL是环境变量,在运行时发送到angular container,以从外部覆盖URL。