gpt4 book ai didi

.net - 在实现 microsoft.build.utilities.task 时,如何访问构建的各种环境变量?

转载 作者:行者123 更新时间:2023-12-01 10:13:45 34 4
gpt4 key购买 nike

在实现 microsoft.build.utilities.task 时,如何访问构建的各种环境变量?

例如“目标路径”

我知道我可以将它作为任务 XML 的一部分传递进来

<MyTask TargetPath="$(TargetPath)" />

但如果我可以在代码中访问变量,我不想强​​迫任务的使用者必须这样做。

http://msdn.microsoft.com/en-us/library/microsoft.build.utilities.task.aspx

最佳答案

我想出了如何做到这一点

public static class BuildEngineExtensions
{
const BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public;

public static IEnumerable GetEnvironmentVariable(this IBuildEngine buildEngine, string key,bool throwIfNotFound)
{
var projectInstance = GetProjectInstance(buildEngine);

var items = projectInstance.Items
.Where(x => string.Equals(x.ItemType, key, StringComparison.InvariantCultureIgnoreCase)).ToList();
if (items.Count > 0)
{
return items.Select(x => x.EvaluatedInclude);
}


var properties = projectInstance.Properties
.Where(x => string.Equals(x.Name, key, StringComparison.InvariantCultureIgnoreCase)).ToList();
if (properties.Count > 0)
{
return properties.Select(x => x.EvaluatedValue);
}

if (throwIfNotFound)
{
throw new Exception(string.Format("Could not extract from '{0}' environmental variables.", key));
}

return Enumerable.Empty();
}

static ProjectInstance GetProjectInstance(IBuildEngine buildEngine)
{
var buildEngineType = buildEngine.GetType();
var targetBuilderCallbackField = buildEngineType.GetField("targetBuilderCallback", bindingFlags);
if (targetBuilderCallbackField == null)
{
throw new Exception("Could not extract targetBuilderCallback from " + buildEngineType.FullName);
}
var targetBuilderCallback = targetBuilderCallbackField.GetValue(buildEngine);
var targetCallbackType = targetBuilderCallback.GetType();
var projectInstanceField = targetCallbackType.GetField("projectInstance", bindingFlags);
if (projectInstanceField == null)
{
throw new Exception("Could not extract projectInstance from " + targetCallbackType.FullName);
}
return (ProjectInstance)projectInstanceField.GetValue(targetBuilderCallback);
}
}

还可以这样使用

string targetPath = buildEngine.GetEnvironmentVariable("TargetPath", true).First();
string intermediateAssembly = buildEngine.GetEnvironmentVariable("IntermediateAssembly", true).First();
IEnumerable<string> referencePaths = buildEngine.GetEnvironmentVariable("ReferencePath", true);

是的,这是丑陋的黑魔法,但它确实有效。

关于.net - 在实现 microsoft.build.utilities.task 时,如何访问构建的各种环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3043531/

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