【问题标题】:Adding a new target type to msbuild: How do I refer to the itemname in the task rules?向 msbuild 添加新的目标类型:如何在任务规则中引用 itemname?
【发布时间】:2010-06-09 21:24:57
【问题描述】:

我正在尝试在构建主 DLL 后添加一个任务来构建 COM 代理 DLL。所以我在 .target 文件中创建了以下内容:

<Target Name="ProxyDLL"
      Inputs="$(IntDir)%(WHATGOESHERE)_i.c;$(IntDir)dlldata.c"
      Outputs="$(OutDir)%(WHATGOESHERE)ps.dll"
      AfterTargets="Link">
   <CL Sources="$(IntDir)%(WHATGOESHERE)_i.c;$(IntDir)dlldata.c" />
</Target>

并从 .vcxproj 文件中将其引用为

<ItemGroup>
  <ProxyDLL Include="FTAccountant" />
</ItemGroup>

因此,FTAccountant.DLL 文件是通过正常的构建过程创建的,然后当尝试编译代理存根时,它会创建以下命令行:

cl /c dir\_i.c dir\dlldata.c

当然它找不到_i.c。第一次尝试,我把 %(Filename) 放在 WHATGOESHERE 空间中,我得到了这个错误:

C:\ActivePay\Build\Proxy DLL.targets(6,3): error MSB4095: The item metadata
%(Filename) is being referenced without an item name.  Specify the item name by
using %(itemname.Filename).

所以我将其更改为 %(itemname.Filename) ,这是一个空字符串。如何获取任务的Include属性中指定的值并在任务中使用?

【问题讨论】:

    标签: visual-studio-2010 msbuild


    【解决方案1】:

    你必须指定你想要其值的元素:

    <ItemGroup>
      <COMProxy Include="FTAccountant" />
    </ItemGroup>
    
    <Target Name="ProxyDLL"
          Inputs="$(IntDir)%(COMProxy.Identity)_i.c;$(IntDir)dlldata.c"
          Outputs="$(OutDir)%(COMProxy.Identity)ps.dll"
          AfterTargets="Link">
       <CL Sources="$(IntDir)%(COMProxy.Identity)_i.c;$(IntDir)dlldata.c" />
    </Target>
    

    【讨论】:

    • 错误 MSB4184:无法评估表达式“”“.identity”。找不到方法“System.String.Identity”。
    • 我认为您有语法错误。您使用 $(COMProxy.Identity) 而不是 %(COMProxy.Identity)
    【解决方案2】:

    我终于想通了。我需要在项目的 Project 标签上添加一个额外的目标:

    <Project Targets="Build;ProxyDLL" ...>
    

    上面的 ProxyDLL 目标从来没有工作过。所以我最终只是为代理 DLL 创建了一个单独的项目,并使用 MSBuild 任务调用它。由于现在从现有项目的上下文中调用它,因此可以使用 ProjectName 变量:

    <Target Name="ProxyDLL"
            Inputs="$(MyPathVar)$(ProjectName)_i.c"
            Outputs="$(OutDir)$(ProjectName)ps.dll"
            AfterTargets="Link">
       <MSBuild Project="$(MyPathVar)$(ProjectName)ps.vcxproj" />
    </Target>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多