0

我在环境变量LIB设置为“--must-override--”的系统上运行。我无法更改系统本身的变量值。

在 Visual Studio 中,编译期间会检查 LIB 变量。因为它设置为垃圾值,所以我在构建中收到警告:

'LIB 环境变量'中指定的无效搜索路径'--must-override--' - '系统找不到指定的路径。

我想摆脱这个警告。为此,我需要将LIBVS 使用的环境变量的值覆盖为 NULL 或指向真实路径的某个值。

由于我无法更改环境中变量的值,因此我需要在 csproj 文件本身中进行更改。我尝试将其设置在属性组中无济于事:

<PropertyGroup>
    <Lib></Lib>
</PropertyGroup>

关于如何设置这个变量的任何想法?或者如果它甚至可能?

4

1 回答 1

1

您可以使用Exec任务来破坏它,或者您可以编写自己的Task来设置它们 - 这是“让我们用 Exec 破坏”路线:

<PropertyGroup>
    <!-- 
      need the CData since this blob is just going to
      be embedded in a mini batch file by studio/msbuild
    -->
    <LibSetter><![CDATA[
set Lib=C:\Foo\Bar\Baz
set AnyOtherEnvVariable=Hello!
]]></LibSetter>
</PropertyGroup>

<Exec Command="$(LibSetter)" />

编辑:所以我只是把这个 csproj 和基础知识一起扔了——我已经确认它们在我运行它们时设置正确——我也添加了 inline-Task 方法。

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

    <UsingTask 
        TaskName="EnvVarSet" 
        TaskFactory="CodeTaskFactory" 
        AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
        <ParameterGroup>
          <VarName ParameterType="System.String" Required="true"/>
          <VarValue ParameterType="System.String" Required="true" />
        </ParameterGroup>
        <Task>
            <Code Type="Fragment" Language="cs">
                <![CDATA[
                    Console.WriteLine("Setting var name {0} to {1}...", VarName, VarValue);
                    System.Environment.SetEnvironmentVariable(VarName, VarValue);
                    Console.WriteLine("{0}={1}", VarName, VarValue);
                ]]>
            </Code>
        </Task>
    </UsingTask>

    <Target Name="ThingThatNeedsEnvironmentVars">
        <CallTarget Targets="FiddleWithEnvironmentVars"/>
        <Message Text="LIB environment var is now: $([System.Environment]::GetEnvironmentVariable('LIB'))"/>
    </Target>

    <Target Name="FiddleWithEnvironmentVars">
        <Message Text="LIB environment var is now: $([System.Environment]::GetEnvironmentVariable('LIB'))"/>
        <EnvVarSet VarName="LIB" VarValue="C:\temp"/>
        <Message Text="LIB environment var is now: $([System.Environment]::GetEnvironmentVariable('LIB'))"/>
    </Target>
</Project>
于 2013-02-26T21:18:06.213 回答