4

尝试在 Visual Studio 2015 Update 2 中发布 TypeScript 项目时;构建成功,但打包/发布失败:

Error: Copying file typescript-filename.js to obj\Release\Package\PackageTmp\typescript-filename.js failed. Could not find file 'typescript-filename.js'.

当项目为 TypeScript 中间/输出文件指定目录时会出现错误。要重现此错误,只需tsconfig.json在新的 Visual Studio TypeScript HTML 应用程序项目的根目录中创建一个文件,其中包含以下内容:

{
    "compilerOptions": {
        "outDir": "transpiled"
    }
}

如果不使用outDir中间/输出目录选项,我会发布我不想要的源文件。(此外,项目输出与源代码混在一起,项目变得一团糟。)

如何从包/发布中排除这些 TypeScript 转译文件?

由于我运行 WebPack 来创建单独的可部署 .JS 捆绑文件(它们包含在我的项目中并成功执行打包/发布),因此我实际上不希望包含任何这些转译文件。


补充研究:

我已经尝试在解决方案资源管理器中排除 .TS 源,将其设置为无/不复制。但这里真的很奇怪:

在我的项目中的 .TS 文件上的“无”和“TypeScript 编译”(设置或取消设置)之间的任何更改都将允许我的项目成功发布到服务器,并且不会部署任何已转译的 .TS/.JS 文件;但直到我做出另一个需要重新构建项目的更改。然后丢失的 .JS 文件错误再次出现。

所以,实际上,我可以执行一些巫术来强制发布,但我仍然很想解决这个问题。

不知何故,C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Transform\Microsoft.Web.Publishing.AspNetCompileMerge.targets到达第 615 行,在变量@(FilesForPackagingFromProject). 就好像其中一个目标直接用 .JS 替换任何 .TS 扩展名(如果它只是运行构建),但不考虑构建中实际发生的情况。

<CopyPipelineFiles PipelineItems="@(FilesForPackagingFromProject)"
                       SourceDirectory="$(WebPublishPipelineProjectDirectory)"
                       TargetDirectory="$(_PreAspnetCompileMergeSingleTargetFolder)"
                       SkipMetadataExcludeTrueItems="True"
                       UpdateItemSpec="True"
                       DeleteItemsMarkAsExcludeTrue ="True">
4

3 回答 3

4

我和你有同样的问题,我用这种方法解决了它:

  1. 编辑导致错误的 .targets 文件(您可以在输出面板中找到它)

  2. 将链接中提供的 xml 粘贴到节点中:

    <Target Name="CustomExcludeFiles" 
          DependsOnTargets="$(ExcludeFilesFromPackageDependsOn)"
          BeforeTargets="ExcludeFilesFromPackage">
    
    <Message Text="Custom exclude..." Importance="high"></Message>
    <WriteLinesToFile Condition="$(EnablePackageProcessLoggingAndAssert)"
                      Encoding="utf-8"
                      File="$(PackageLogDir)\CustomExcludeFilesBefore.txt"
                      Lines="@(FilesForPackagingFromProject->'
                      From:%(Identity) 
                      DestinationRelativePath:%(DestinationRelativePath) 
                      Exclude:%(Exclude) 
                      FromTarget:%(FromTarget) 
                      Category:%(Category)
                      ProjectFileType:%(ProjectFileType)')" Overwrite="True" />
    
    <ItemGroup>
      <FilesForPackagingFromProject Remove="@(FilesForPackagingFromProject)" Condition="!Exists('%(FullPath)')" />
    </ItemGroup>
    <WriteLinesToFile Condition="$(EnablePackageProcessLoggingAndAssert)"
                      Encoding="utf-8"
                      File="$(PackageLogDir)\CustomExcludeFilesAfter.txt"
                      Lines="@(FilesForPackagingFromProject->'
                      From:%(Identity) 
                      DestinationRelativePath:%(DestinationRelativePath) 
                      Exclude:%(Exclude) 
                      FromTarget:%(FromTarget) \
                      Category:%(Category)
                      ProjectFileType:%(ProjectFileType)')" Overwrite="True"/>
    </Target>
    
    1. 保存、重新启动 Visual Studio 并重新发布
于 2016-05-19T09:28:23.080 回答
0

您可以使用以下 MSBuild 代码段从包中排除文件:

<ItemGroup>  
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">  
    <FromTarget>Project</FromTarget> 
  </ExcludeFromPackageFiles> 
</ItemGroup> 

查看 Sayed 的博客以获得完整的教程:

http://sedodream.com/2010/08/15/WebDeploymentToolMSDeployHowToExcludeFilesFromPackageBasedOnConfiguration.aspx

于 2016-05-04T02:01:58.897 回答
0

我遇到过同样的问题。我将 Visual Studio 的TypeScript 工具升级到 2.1.4,现在一切正常

https://www.microsoft.com/en-us/download/details.aspx?id=48593

于 2017-01-08T15:36:34.963 回答