gpt4 book ai didi

msbuild - 为什么 %(Identity) 扩展为空字符串?

转载 作者:行者123 更新时间:2023-12-01 23:50:50 26 4
gpt4 key购买 nike

我被告知以下内容应该创建一个文件的 ItemGroup,其中包含说明它们是否为只读的元数据:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Run"
ToolsVersion="12.0">

<Target Name="Main">
<ItemGroup>
<MyFiles Include="test.proj"> <!-- also tried with *.*. Using test.proj (this file) to be sure it is a file that exists -->
<ReadOnly Condition='1 == $([MSBuild]::BitwiseAnd(1, $([System.IO.File]::GetAttributes("%(Identity)"))))'>True</ReadOnly>
</MyFiles>
</ItemGroup>

</Target>

<Target Name="Run" Outputs="%(MyFiles.Identity)" DependsOnTargets="Main">
<Message Text="%(MyFiles.Identity) Not ReadOnly" Condition="%(MyFiles.ReadOnly) != True"/>
<Message Text="%(MyFiles.Identity) ReadOnly" Condition="%(MyFiles.ReadOnly) == True" />
</Target>

</Project>

但是,我得到以下输出(从 Visual Studio 2013 的开发人员命令提示符运行时):

S:\>msbuild test.proj
Microsoft (R) Build Engine version 12.0.30723.0
[Microsoft .NET Framework, version 4.0.30319.34014]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 30/10/2014 21:18:46.
Project "S:\test.proj" on node 1 (default targets).
S:\test.proj(9,13): error MSB4184: The expression "[System.IO.File]::GetAttributes('')" cannot be evaluated. The path is not of a legal form.
Done Building Project "S:\test.proj" (default targets) -- FAILED.


Build FAILED.

"S:\test.proj" (default target) (1) ->
(Main target) ->
S:\test.proj(9,13): error MSB4184: The expression "[System.IO.File]::GetAttributes('')" cannot be evaluated. The path is not of a legal form.

0 Warning(s)
1 Error(s)

Time Elapsed 00:00:00.01

S:\>

这应该有效吗?如果是这样,我哪里出错了?

最佳答案

从目标中创建项目组时,您似乎无法引用项目元数据。

将脚本更改为:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Run"
ToolsVersion="12.0">

<ItemGroup>
<MyFiles Include="test.proj" >
<ReadOnly Condition='1 == $([MSBuild]::BitwiseAnd(1, $([System.IO.File]::GetAttributes("%(Identity)"))))'>True</ReadOnly>
</MyFiles>
</ItemGroup>

<Target Name="Run" Outputs="%(MyFiles.Identity)">
<Message Text="%(MyFiles.Identity) Not ReadOnly" Condition="%(MyFiles.ReadOnly) != True"/>
<Message Text="%(MyFiles.Identity) ReadOnly" Condition="%(MyFiles.ReadOnly) == True" />
</Target>

</Project>

将产生以下输出:

D:\temp\test>"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" test1.msbuild /t:run
Microsoft (R) Build Engine version 12.0.30723.0
[Microsoft .NET Framework, version 4.0.30319.18444]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 10/30/2014 4:31:35 PM.
Project "D:\temp\test\test1.msbuild" on node 1 (run target(s)).
Run:
test.proj Not ReadOnly
Done Building Project "D:\temp\test\test1.msbuild" (run target(s)).


Build succeeded.
0 Warning(s)
0 Error(s)

Time Elapsed 00:00:00.17

D:\temp\test>

如果保证在脚本运行之前所有项目都存在,则可以将脚本更改为此。但是,我怀疑因为您是从他们没有的目标中使用它的。在这种情况下,您可能不得不求助于 CreateItem 任务。

关于msbuild - 为什么 %(Identity) 扩展为空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26663522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com