我有一个 MSBuild 项目目标,需要从文件文件夹(我们称之为文件夹 A)创建一个 zip 文件,其中一些文件需要排除而不添加到 zip 文件中,因此目标需要复制文件(排除的文件除外)从FolderA复制到临时文件夹,然后在临时文件夹上调用目标ZipDirectory目标。
我通过创建项目组来创建临时文件夹
<ItemGroup>
<TempStagingFolder Include="$([System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()))" />
</ItemGroup>
但这永远不会计算为文件夹名称,只是静态方法调用
System.IO.Path
如何在 MSBuild 中创建临时随机文件夹名称以传递到 ZipDirectory 目标?
将您的代码更改为
<ItemGroup>
<TempStagingFolder Include="$([System.IO.Path]::Combine($([System.IO.Path]::GetTempPath()), $([System.IO.Path]::GetRandomFileName())))" />
</ItemGroup>
每个静态属性方法调用都需要用
$()
括起来。
对于故障排除、维护和覆盖,您可能会发现从属性构建文件夹路径和名称很有用,例如:
<PropertyGroup>
<TempStagingPath Condition="'$(TempStagingPath)' == ''">$([System.IO.Path]::GetTempPath())</TempStagingPath>
<TempStagingFolderName Condition="'$(TempStagingFolderName)' == ''">$([System.IO.Path]::GetRandomFileName())</TempStagingFolderName>
<TempStagingFolder Condition="'$(TempStagingFolder)' == ''">$([System.IO.Path]::Combine($(TempStagingPath), $(TempStagingFolderName)))</TempStagingFolder>
</PropertyGroup>
<ItemGroup>
<TempStagingFolder Include="$(TempStagingFolder)" />
</ItemGroup>
属性名称和项目名称不冲突。
$(TempStagingFolder)
和 @(TempStagingFolder)
是不同的“对象”。
通过拥有单独的属性,如果出现问题,您可以检查特定属性。测试该属性尚未设置,允许使用不同的值覆盖该属性。