我正在将视觉工作室构建“迁移”到批处理脚本, 我有一个大项目,有很多依赖项,
我使用 Windows 批处理脚本通过 msbuild.exe 构建我的项目, 主项目(客户端)有许多依赖项。 我首先构建依赖项,将它们输出到各自的目录(每个目录),然后将输出复制到名为 client 的文件夹中, 然后,我将主项目(客户端)构建到同一目录中。
msbuild命令:
msbuild.exe <csproj_file> /p:SkipInvalidConfiguration=true /p:BuildProjectReferences=true /p:PublishDir=client_dir /p:OutDir=client_dir /p:OutputPath=client_dir /p:Platform="Any CPU" /p:Configuration=Release
我陷入了困境,我是 DevOps,只会将此构建迁移到批处理和 Jenkins 中。
可以公平地说,在 Visual Studio 中构建项目时,完全没有错误。
有什么想法吗?
如果您还没有这样做,我建议您在解决方案中使用 SDK 项目文件,因为它们功能更丰富并且更易于编辑。请参阅此 MS Learn 页面,了解有关 SDK 的更多信息。
首先,删除解决方案中的所有
bin
和 obj
文件夹。根据我的经验,VS 在 obj
目录中缓存了大量构建工件,通常包括导致一些错误的 AssemblyInfo.cs
文件。
真正清理后(删除所有
bin
和 obj
文件夹),将以下内容添加到您的项目文件中:
<PropertyGroup>
<GenerateAssemblyInfo>False</GenerateAssemblyInfo>
</PropertyGroup>
该命令将阻止生成程序集信息。您不会希望长期将此保留在您的解决方案中,但是它将有助于您确定此错误的根本原因。
根据您修改项目的自由度,您可以考虑将程序集信息添加到您的
.csproj
:
<PropertyGroup>
<AssemblyName>$(RootNamespace)</AssemblyName>
<AssemblyVersion>$(Version)</AssemblyVersion>
<FileVersion>$(Version)</FileVersion>
</PropertyGroup>
然后,您可以通过在解决方案的根目录中运行以下命令来尝试重新创建成功的 Visual Studio 构建:
dotnet build YourProj.csproj -c Release -p:Platform="AnyCPU" -p:SkipInvalidConfiguration=true -p:BuildProjectReferences=true
如果您对 VS 构建解决方案的方式感到满意,您可以尝试运行:
dotnet build YourSolution.sln -c Release -p:Platform="AnyCPU" ...
dotnet build
在后台调用 MSBuild (MSLearn - dotnet build),因此您的构建过程不会受到影响。
在项目文件中,您可以指定构建输出目录,这样就可以避免在脚本中指定它。并非绝对必要,但您可能会发现它很有帮助。这可以通过将其添加到您的项目文件中来完成:
<PropertyGroup>
<OutDir>client_dir</OutDir>
</PropertyGroup>