在 MSBuild 中将字符串编码为 Base64
Encode String to Base64 in MSBuild
我想在 msbuild 目标中将字符串转换为 base64,但 msbuild 告诉我类型转换不可用。
<ItemGroup>
<Headers Include="Authorization">
<Content>$([Convert]::ToBase64String("user:password"))</Content>
</Headers>
</ItemGroup>
有人能帮帮我吗?
编辑:
找到了一个我不喜欢的解决方案:
<UsingTask TaskName="ToBase64" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup>
<In ParameterType="System.String" Required="true" />
<Out ParameterType="System.String" Output="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs">
Out = System.Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(In));
</Code>
</Task>
</UsingTask>
<Target Name="WebRequest">
<ToBase64 In="$(auth)">
<Output PropertyName="authBase64" TaskParameter="Out" />
</ToBase64>
</Target>
有没有更好的方法?
您不能使用 MSBuild 属性 函数为所欲为。有一些限制,其中之一是只能使用少数命名空间。你在这里有整个列表:http://blogs.msdn.com/b/visualstudio/archive/2010/04/02/msbuild-property-functions.aspx
您的问题是您需要 System.Text.Encoding
名称空间(以获取字符串的字节数组),但该名称空间不受支持。
作为证明:
<ItemGroup>
<Headers Include="Authorization">
<Content>$([System.Convert]::ToBase64String($([System.Text.Encoding]::Default.GetBytes("user:password"))))</Content>
</Headers>
</ItemGroup>
<Target Name="Deploy" >
<Message Text="@(Headers->'%(Content)')" Importance="high" />
</Target>
失败 error MSB4185: The function "Default" on type "System.Text.Encoding" is not available for execution as an MSBuild property function.
但是如果您设置环境变量 MSBUILDENABLEALLPROPERTYFUNCTIONS=1 那么它会成功:
D:\set MSBUILDENABLEALLPROPERTYFUNCTIONS=1
D:\>c:\windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe test.proj
Project "D:\test.proj" on node 1 (default targets).
Deploy:
dXNlcjpwYXNzd29yZA==
Done Building Project "D:\test.proj" (default targets).
出于维护原因,我建议您坚持使用冗长的任务方法,因为不支持此环境变量。
我想在 msbuild 目标中将字符串转换为 base64,但 msbuild 告诉我类型转换不可用。
<ItemGroup>
<Headers Include="Authorization">
<Content>$([Convert]::ToBase64String("user:password"))</Content>
</Headers>
</ItemGroup>
有人能帮帮我吗?
编辑:
找到了一个我不喜欢的解决方案:
<UsingTask TaskName="ToBase64" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup>
<In ParameterType="System.String" Required="true" />
<Out ParameterType="System.String" Output="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs">
Out = System.Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(In));
</Code>
</Task>
</UsingTask>
<Target Name="WebRequest">
<ToBase64 In="$(auth)">
<Output PropertyName="authBase64" TaskParameter="Out" />
</ToBase64>
</Target>
有没有更好的方法?
您不能使用 MSBuild 属性 函数为所欲为。有一些限制,其中之一是只能使用少数命名空间。你在这里有整个列表:http://blogs.msdn.com/b/visualstudio/archive/2010/04/02/msbuild-property-functions.aspx
您的问题是您需要 System.Text.Encoding
名称空间(以获取字符串的字节数组),但该名称空间不受支持。
作为证明:
<ItemGroup>
<Headers Include="Authorization">
<Content>$([System.Convert]::ToBase64String($([System.Text.Encoding]::Default.GetBytes("user:password"))))</Content>
</Headers>
</ItemGroup>
<Target Name="Deploy" >
<Message Text="@(Headers->'%(Content)')" Importance="high" />
</Target>
失败 error MSB4185: The function "Default" on type "System.Text.Encoding" is not available for execution as an MSBuild property function.
但是如果您设置环境变量 MSBUILDENABLEALLPROPERTYFUNCTIONS=1 那么它会成功:
D:\set MSBUILDENABLEALLPROPERTYFUNCTIONS=1
D:\>c:\windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe test.proj
Project "D:\test.proj" on node 1 (default targets).
Deploy:
dXNlcjpwYXNzd29yZA==
Done Building Project "D:\test.proj" (default targets).
出于维护原因,我建议您坚持使用冗长的任务方法,因为不支持此环境变量。