针对 Microsoft.Common.CurrentVersion.targets 之上的新语言

亚历克斯·朱科夫斯基

我正在编写一个简单的扩展,以允许 MSBuild 编译 Solidity 源文件。

我的目标是当我solidproj被编译运行产生几个特定的可执行文件bin,并abi应复制到目标目录中的文件。这听起来很容易,但在实践中却并非如此。

我目前有以下目标:

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

  <Import Project="$(MSBuildToolsPath)\Microsoft.Common.CurrentVersion.targets" />
  <Target Name="CreateManifestResourceNames" />
  <Target Name="CoreCompile">
    <Exec Command='$(RunCommand) "-o @(OutDir) @(SolCompile)" $(RunCommandArguments)' WorkingDirectory="$(RunWorkingDirectory)" />
  </Target>
</Project>

它几乎可以工作,只是它期望exe编译单个文件

<!-- Copy the build product (.dll or .exe). -->
<Copy
    SourceFiles="@(IntermediateAssembly)"
    DestinationFolder="$(OutDir)"
    SkipUnchangedFiles="$(SkipCopyUnchangedFiles)"
    OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
    Retries="$(CopyRetryCount)"
    RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
    UseHardlinksIfPossible="$(CreateHardLinksForCopyFilesToOutputDirectoryIfPossible)"
    UseSymboliclinksIfPossible="$(CreateSymbolicLinksForCopyFilesToOutputDirectoryIfPossible)"
    Condition="'$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)' != 'true'"
        >

  <Output TaskParameter="DestinationFiles" ItemName="MainAssembly"/>
  <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>

</Copy>

错误 MSB3030 无法复制文件“obj\Debug\Solidity9.exe”,因为找不到它。Solidity9 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets 4118

我如何要求它将此特定扩展名的所有内容复制到输出?

整个项目是在github这里

亚历克斯·朱科夫斯基

我最终从头开始创建所有构建步骤:

  <ItemGroup>
    <CopyUpToDateMarker Include="$([MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '$(IntermediateOutputPath)', '$(MSBuildProjectFile).CopyComplete'))" />
  </ItemGroup>

  <UsingTask
    TaskName="GetOutdatedFiles"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >

    <ParameterGroup>
      <FileList ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
      <UpToDateMarker ParameterType="System.String" Required="true" />
      <Result ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System"/>
      <Code Type="Fragment" Language="cs">
        <![CDATA[
          var modifiedFiles = new List<ITaskItem>();
          if(!File.Exists(UpToDateMarker))
          {
            Result = FileList;
          }
          else 
          {
            DateTime markerTimeStamp = File.GetLastWriteTime(UpToDateMarker);
            Result = FileList.Where(file => DateTime.Parse(file.GetMetadata("ModifiedTime")) > markerTimeStamp).ToArray();
          }
          ]]>
      </Code>
    </Task>
  </UsingTask>

  <Target Name="Build" DependsOnTargets="CoreBuild;AfterBuild" />

  <Target Name="CoreBuild">
    <Error Condition="'$(OutDir)' == ''" Text="The OutDir property is missing" />
    <Error Condition="'$(IntermediateOutputPath)' == ''" Text="The IntermediateOutputPath property is missing" />

    <GetOutdatedFiles FileList="@(SolCompile)" UpToDateMarker="@(CopyUpToDateMarker)">
      <Output TaskParameter="Result" ItemName="ChangedFiles"/>
    </GetOutdatedFiles>

    <Exec Command='$(RunCommand) "%(ChangedFiles.Identity)" -o "$(IntermediateOutputPath)" $(RunCommandArguments)' WorkingDirectory="$(RunWorkingDirectory)" Condition="'@(ChangedFiles)' != ''"/>
  </Target>

  <Target Name="AfterBuild">
    <ItemGroup>
      <BinFiles Include="$(IntermediateOutputPath)/*.bin"/>
      <AbiFiles Include="$(IntermediateOutputPath)/*.abi"/>
    </ItemGroup>

    <Copy SourceFiles="@(BinFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true">
      <Output TaskParameter="CopiedFiles" ItemName="BinFilesCopiedInThisBuild"/>
    </Copy>
    <Copy SourceFiles="@(AbiFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true">
      <Output TaskParameter="CopiedFiles" ItemName="AbiFilesCopiedInThisBuild"/>
    </Copy>
    <Touch Files="@(CopyUpToDateMarker)" AlwaysCreate="true" Condition="'@(BinFilesCopiedInThisBuild)'!='' or '@(AbiFilesCopiedInThisBuild)'!=''" />
  </Target>

  <Target Name="Clean">
    <Delete Files="@(CopyUpToDateMarker)" />
    <RemoveDir Directories="$(OutDir)" />
  </Target>

  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />

仍然需要解决传递依赖的问题,但这是另一个问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

MS-Build 2017“ Microsoft.WebApplication.targets”丢失

来自分类Dev

缺少Microsoft Common Controls

来自分类Dev

Microsoft.WebApplication.targets

来自分类Dev

vs-mda-targets\Microsoft.MDA.targets was not found

来自分类Dev

找不到vs-mda-targets \ Microsoft.MDA.targets

来自分类Dev

如何创建针对JVM的自己的编程语言?

来自分类Dev

错误MSB4019:找不到导入的项目Microsoft.TextTemplating.targets“

来自分类Dev

错误:*。csproj无法在MonoDevelop上导入“ $(MSBuildBinPath)\ Microsoft.CSharp.targets”

来自分类Dev

从Mono使用Microsoft.VisualStudio.Web.targets?

来自分类Dev

打开项目时找不到Microsoft.CompactFramework.CSharp.targets

来自分类Dev

如何下载Microsoft.TeamFoundation.Framework.Common.dll

来自分类Dev

为什么Microsoft开发了一种称为Typescript的新语言而不是为Javascript Transpiler创建C#

来自分类Dev

安装.NET Core RTM后缺少Microsoft.DotNet.Web.targets

来自分类Dev

Visual Studio 2015(ASP.NET Core)编译错误错误:Microsoft.DotNet.Common.Targets-具有相同键的项已添加

来自分类Dev

使用Inno Setup将自定义字符串值写入SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall

来自分类Dev

HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \。<扩展名> \ UserChoice中的哈希是什么?

来自分类Dev

无法通过命令行删除HKLM \ Microsoft \ Windows \ CurrentVersion \ Run中的注册表项

来自分类Dev

构建取决于AfterBuild Microsoft.Common.targets

来自分类Dev

在Visual Studio中打包云项目:Microsoft.WindowsAzure.targets:目录不为空

来自分类Dev

HKCU \ software \ microsoft \ windows \ currentversion \ explorer \ fileexts的作用是什么?

来自分类Dev

Microsoft Word中针对单个作者的简单版本控制

来自分类Dev

安装.NET Core RTM后缺少Microsoft.DotNet.Web.targets

来自分类Dev

如何知道特定外接程序项目针对的Microsoft Office版本?

来自分类Dev

Microsoft.Cpp.Clang.targets 错误:元素 <ExceptionHandling> 的“Async”值无效

来自分类Dev

损坏的 Xamarin.Android.Common.targets 文件:_CompileJava 上的错误

来自分类Dev

Android NDK 安装 TARGETS 没有针对可执行目标的 RUNTIME DESTINATION

来自分类Dev

编写针对 ios 和 android 的跨平台 kotlin 'common' 模块

来自分类Dev

\MSBuild\16.0\Bin\Microsoft.CSharp.targets 文件未找到

来自分类Dev

在 Web 应用程序构建期间未找到 Microsoft.WebApplication.targets

Related 相关文章

  1. 1

    MS-Build 2017“ Microsoft.WebApplication.targets”丢失

  2. 2

    缺少Microsoft Common Controls

  3. 3

    Microsoft.WebApplication.targets

  4. 4

    vs-mda-targets\Microsoft.MDA.targets was not found

  5. 5

    找不到vs-mda-targets \ Microsoft.MDA.targets

  6. 6

    如何创建针对JVM的自己的编程语言?

  7. 7

    错误MSB4019:找不到导入的项目Microsoft.TextTemplating.targets“

  8. 8

    错误:*。csproj无法在MonoDevelop上导入“ $(MSBuildBinPath)\ Microsoft.CSharp.targets”

  9. 9

    从Mono使用Microsoft.VisualStudio.Web.targets?

  10. 10

    打开项目时找不到Microsoft.CompactFramework.CSharp.targets

  11. 11

    如何下载Microsoft.TeamFoundation.Framework.Common.dll

  12. 12

    为什么Microsoft开发了一种称为Typescript的新语言而不是为Javascript Transpiler创建C#

  13. 13

    安装.NET Core RTM后缺少Microsoft.DotNet.Web.targets

  14. 14

    Visual Studio 2015(ASP.NET Core)编译错误错误:Microsoft.DotNet.Common.Targets-具有相同键的项已添加

  15. 15

    使用Inno Setup将自定义字符串值写入SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall

  16. 16

    HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \。<扩展名> \ UserChoice中的哈希是什么?

  17. 17

    无法通过命令行删除HKLM \ Microsoft \ Windows \ CurrentVersion \ Run中的注册表项

  18. 18

    构建取决于AfterBuild Microsoft.Common.targets

  19. 19

    在Visual Studio中打包云项目:Microsoft.WindowsAzure.targets:目录不为空

  20. 20

    HKCU \ software \ microsoft \ windows \ currentversion \ explorer \ fileexts的作用是什么?

  21. 21

    Microsoft Word中针对单个作者的简单版本控制

  22. 22

    安装.NET Core RTM后缺少Microsoft.DotNet.Web.targets

  23. 23

    如何知道特定外接程序项目针对的Microsoft Office版本?

  24. 24

    Microsoft.Cpp.Clang.targets 错误:元素 <ExceptionHandling> 的“Async”值无效

  25. 25

    损坏的 Xamarin.Android.Common.targets 文件:_CompileJava 上的错误

  26. 26

    Android NDK 安装 TARGETS 没有针对可执行目标的 RUNTIME DESTINATION

  27. 27

    编写针对 ios 和 android 的跨平台 kotlin 'common' 模块

  28. 28

    \MSBuild\16.0\Bin\Microsoft.CSharp.targets 文件未找到

  29. 29

    在 Web 应用程序构建期间未找到 Microsoft.WebApplication.targets

热门标签

归档