问题:是否可以运行mono的msbuild
并强制其将特定目录用作特定名称空间。例如,命名空间DevExpress
可以映射到目录/app/MyApp/DevExpress
。或者,如果这不是一种选择,那么我们如何使我们的项目知道使用NuGet新安装的软件包?
在某些情况下:几年前,我们继承了一个(非常)旧的应用程序堆栈,其中包括.NET应用程序,该应用程序使用DevExpress构建了一套由我的客户用来运行其应用程序的3个应用程序事件。我们不知道.NET(警告客户并接受了它,希望专注于他的Web应用程序),但是我们设法稳定了它,并且已经使用PowerShell和msbuild对其进行了几年编译。
我们希望今年能自动处理此客户的大量流程,以节省大量时间。为此,我们希望在CI服务器上自动编译.NET应用程序,并推送压缩文件,以便在客户端需要新安装时都可以部署。
项目没有最初使用NuGet,但是要使所有这些自动化,我们认为我们可以设置带有mono的Docker容器,使用nuget提取依赖项,然后进行编译。
遗憾的是,由于名称空间解析似乎无法正常工作,我们目前遇到了麻烦。
"/app/MyApp/MyApp.csproj" (default target) (1) ->
"/app/DataAccessLayer/DataAccessLayer.csproj" (default target) (3:2) ->
(CoreCompile target) ->
xp Server Objects/dbo_CITY.cs(6,7): error CS0246: The type or namespace name 'DevExpress' could not be found (are you missing a using directive or an assembly reference?) [/app/DataAccessLayer/DataAccessLayer.csproj]
编辑:我将zivkan的答案标记为正确,因为虽然它没有给我可以实施的解决方案,但它给了我(希望这个问题)许多有用的信息向前。
答案 0 :(得分:0)
构建.NET项目不能那样工作(在路径x中查找名称空间y)。取而代之的是,除了源文件之外,还为编译器提供了dll列表以供参考,并且编译器会扫描所有引用的元数据,以查看可用的名称空间/类。我相信Java与jar文件的工作方式几乎相同,尽管我从未在Java中做过认真的事情。
通常的工作方式是使用Visual Studio(或其他了解.NET的IDE)并使用集成工具向项目添加NuGet包,如install a package with Visual Studio quickstart docs所示。如果使用.NET Core,则可以从命令行使用dotnet add package <package id
。这会修改项目文件(.csproj),因此构建系统会知道该文件(如果您使用PackageReference
,那么直接直接编辑csproj就足够了,但是如果使用packages.config
,则绝对需要工具为您做到)
然后,CI的构建过程是先下载nuget.exe,然后运行nuget.exe restore
,然后构建项目,或者在使用.NET Core时运行dotnet restore
和dotnet build
(自以来。 NET Core 2.0还原是作为构建的一部分自动进行的,因此不再需要执行单独的步骤。这也是使用.NET Core的另一个优点,不再需要下载nuget.exe即可还原,最终NuGet已内置到构建系统中(从技术上讲,我认为非SDK风格的项目也可以使用PackageReference
来完成此操作和msbuild -restore
)。
您收到有关缺少名称空间的错误消息的事实表明,您可能没有在CI计算机上运行nuget restore
,或者您可能没有以通常的方式使用NuGet。