我有两个可以很好地构建和部署的模块。但是他们俩都有共享的代码,我想将它们拉到一个单独的“共享”项目中。这些模块引用了共享项目,并且一切似乎正常。
但是当我要构建docker映像时,我得到了以下跟踪信息:
PROCESSING DOCKER FILE: ./Dockerfile
PUBLISHING MODULE: modules/Valid.PrivacyCrawler.Crawlers
Microsoft (R) Build Engine version 15.5.179.9764 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.
BUILDING DOCKER IMAGE: privacycrawler.azurecr.io/valid.privacycrawler.crawlers:0.0.12-amd64
Traceback (most recent call last):
File "/usr/local/bin/iotedgedev", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 722, in __call__
return self.main(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 697, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 1066, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 895, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 535, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/iotedgedev/cli.py", line 132, in push
ctx.invoke(modules, push=push, deploy=deploy, no_build=no_build)
File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 535, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/iotedgedev/cli.py", line 454, in modules
mod.push(no_build=no_build)
File "/usr/local/lib/python2.7/dist-packages/iotedgedev/modules.py", line 22, in push
self.build_push(no_build=no_build)
File "/usr/local/lib/python2.7/dist-packages/iotedgedev/modules.py", line 77, in build_push
build_result = self.dock.docker_client.images.build(tag=image_destination_name, path=".", dockerfile=docker_file_name, buildargs={"EXE_DIR": mod_proc.exe_dir})
File "/usr/local/lib/python2.7/dist-packages/docker/models/images.py", line 183, in build
raise BuildError(chunk['error'], result_stream)
docker.errors.BuildError: The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1
当我复制代码并且不使用共享项目时,它只会毫无问题地构建模块。
是否有一个共享项目,它是.NET核心,就像模块一样,不被支持?
我可以毫无问题地使用NuGet包(例如Newtonsoft.JSON)。
答案 0 :(得分:0)
是的,据我所知,它不支持边缘模块的共享项目。但是您可以创建一个库项目,构建该项目,然后将dll添加为对模块项目的引用。它可以解决。您可以针对此要求发布反馈here。
答案 1 :(得分:0)
也将此问题发布在IoTEdgeDev GitHub上。似乎在IoT Edge的完整版本中发生了一些问题,它们将在IoT Edge Dev的完整版本中修复共享项目的错误。
@Michael Xu,我已经尝试过了,并且遇到了同样的异常。还尝试过用我的项目制作一个NuGet软件包,并以这种方式添加它,没运气。
答案 2 :(得分:0)
我们实际上设法使用一个共享项目,但是棘手的事情是修改您的Dockerfile以包括所有引用的项目。 这必须手动完成。 您必须在Dockerfile中添加类似于这一行的行:
COPY ReferencedProjectFolder/ReferencedProject.csproj ReferencedProjectFolder/
但是,您不能使用VS Build,因为它传递的上下文仅限于要构建的模块的文件夹。您必须编写自己的docker build
命令并通过Powershell构建模块。该命令可以从VS Build输出中复制。但是build
命令的context参数也应该更改为使用父目录。一个例子:
cd <module_folder>
docker build --rm -f $dockerfileName -t $imageNameTagged $buildContext
$buildContext
应该是模块及其所有引用项目为子文件夹的父目录的路径,否则上述COPY
命令将失败,因为它不会“看到”引用的项目文件夹。
通过这种方式,我们已经实现了所有基本层:数据,业务,公共等。此外,我们设法实现了一种继承机制,例如基本类作为单独的模块添加,但实际上未在IoT Edge部署json中定义。
希望这会有所帮助。