我的情况是,我有一组受源代码控制的 C# 文件。我下载它,然后在命令行中使用此命令构建解决方案文件。
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" MyProj.sln /property:Platform=x64
但是当我这样做时,CoreCompile 会被跳过,并显示“正在跳过目标“CoreCompile”,因为所有输出文件相对于输入文件都是最新的。”问题是,它生成的 dll 不包含 .cs 文件中的许多更改。
当我在 .cs 文件中进行小的更改(例如放置日志)时,它会构建得很好并且生成的 dll 包含所有更改。
但是,32 位版本是在第一次构建时不跳过 CoreCompile 的。 (相同的命令,但带有
/property:Platform=x86
)
我无法理解这种行为。请帮忙。谢谢。
MSBuild 能够增量构建。它通过检测每个目标之间输入文件的更改以及丢失的输出文件来实现这一点。如果您更新存储库并且未对
.cs
文件进行任何更改,则应跳过 CoreCompile
。您可以在此处查找最新 roslyn 版本的输入和输出。
您可以使用
/t:Rebuild
强制进行干净构建(与 "/t:Clean;Build"
相同)。
另请注意,更改通过
/p:name=value
传入的参数通常不会影响构建。增量构建逻辑基于文件更改,而不是值。如果影响输出目录的参数发生更改,则输出被视为丢失。如果只有一个参数更改影响了某些编译设置,则可能会触发增量构建的目标。这些类型的设置通常在项目中设置,这会导致 $(MSBuildAllProjects)
发生更改,这通常是增量目标的输入。
例如在 .NET Core 中设置 /p:Version=1.2.3
或
/p:VersionSuffix=beta1
时出现问题,但不影响增量构建。
这里的实际问题不是因为
msbuild
。 64 位平台文件的输出 bin 文件夹 (in\debug\x64*) 也已签入存储库中。这就是 msbuild
没有发生的原因。