这很奇怪。我们一直在试图弄清楚它,但它真的没有任何意义。
我们的 Web 项目导入了一个目标文件,该文件的目标类似于:
<Target Name="CSSCheckInternal">
<ItemGroup>
<CSSFiles Include="$(MSBuildProjectDirectory)\**\*.css" />
</ItemGroup>
<CSSChecker Files="@(CSSFiles)" />
</Target>
目前,一个分支正在完美构建,按要求执行任务;但另一个分支在上述目标上失败了。
失败是因为该@(CSSFiles)
项目在被任务接收时似乎没有扩展到ITaskItem
数组中。
任务编写如下(直到我获得 FullPath 元数据):
public class CSSChecker : Task
{
[Required]
public ITaskItem[] Files
{
get;
set;
}
public override bool Execute()
{
string fullFilePath = null;
if (Files != null)
{
foreach (var item in Files)
{
fullFilePath = item.GetMetadata("FullPath");
if(!File.Exists(fullFilePath))
throw new InvalidOperationException(
string.Format("{0} does not exist", fullFilePath));
//rest of the code elided
失败的构建InvalidOperationException
在最后一行抛出,如下所示:
文件不存在:C:\Code\Project\**\*.css
因此,似乎 MSBuild 并没有扩展Include
属性中的通配符,而只是将字符串传递过来,因此只ITaskItem
在任务上创建了一个。
目标文件夹确实存在于磁盘上,损坏的项目文件和工作文件之间的唯一区别是项目文件中包含更早的单个文件。
更新
我在 Twitter 上询问了 Sayed Hashimi(写了MSBuild 书),并通过它尝试取出**
文件夹通配符,它现在开始工作了。这并不适合,因为该任务旨在在项目之间重用。但这似乎与此有关。
结束更新
如果有人知道在什么情况下 MSBuild 不会正确扩展通配符,那将是一个很大的帮助!