【问题标题】:Exclude transpiled/non-existent .JS files from TypeScript Web Publish从 TypeScript Web Publish 中排除转译/不存在的 .JS 文件
【发布时间】:2016-05-03 13:02:04
【问题描述】:

尝试在 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 中间/输出文件指定目录时出现错误。要重现此错误,只需在新的 Visual Studio TypeScript HTML 应用程序项目的根目录中创建一个 tsconfig.json 文件,其内容如下:

{
    "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 行,其中包含 (AFAIK) 在构建或打包过程中的任何时候都不存在的文件列表,位于变量 @(FilesForPackagingFromProject) 中。就好像其中一个目标直接用 .JS 替换任何 .TS 扩展名(如果它只是运行构建),但不考虑构建中实际发生的情况。

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

【问题讨论】:

    标签: visual-studio typescript msdeploy one-click-web-publishing


    【解决方案1】:

    我和你有同样的问题,我用这个approach解决了它:

    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 并重新发布

    【讨论】:

    • 谢谢。我希望能够以一种允许他们发布比编辑系统文件更轻松的方式与团队共享这个项目;例如带有安装程序的补丁,或对我的项目的更改。有时间我会考虑将您的修复程序插入到项目 .targets 中。
    • 谢谢。这在我使用 Visual Studio 2013 和发出单个 javascript 文件的 tsconfig 的情况下效果很好。我只是将 xml 复制到一个单独的 .targets 文件中,然后使用 标记将其导入到我的 .csproj 中。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以使用以下 MSBuild sn-p 从包中排除文件:

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

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

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

      【讨论】:

      • 你用过那个解决方案吗?如果有一个真正的现有包应该在它之前,我无法判断,因为可能只是拼写错误。
      • 实际上,更简单的解决方案可能对我有用,而且似乎没有错误。会回来报告的。
      • 是的,这绝对行不通。尝试了十几种不同的方式,然后进行了大量诊断以确保它处于活动状态。问题是该文件不存在,因此使用 glob 排除它并不会排除它。
      • 我有 VS 2015 Update 2 并重新创建了场景,但使用右键单击发布方法进行部署没有任何问题。
      • 等一下,您是否在添加tsconfig.json 文件之前进行了构建?如果您有一个与app.ts 文件相邻的app.js 文件(它不会包含在项目中),则必须删除它才能收到错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2017-11-28
      • 1970-01-01
      • 2014-10-20
      • 2016-04-06
      • 2013-02-15
      • 2016-02-13
      相关资源
      最近更新 更多