Добавление нового целевого типа в msbuild: как мне обратиться к имени элемента в правилах задачи? - PullRequest
0 голосов
/ 10 июня 2010

Я пытаюсь добавить задачу для сборки 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 задачи, и использовать его в задаче?

Ответы [ 2 ]

0 голосов
/ 28 июля 2010

Я наконец понял это. Мне нужно было поставить дополнительную цель на тег проекта 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>
0 голосов
/ 10 июня 2010

Вы должны указать элемент, значение которого вы хотите:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...