从TypeScript Web Publish中排除已转换/不存在的.JS文件

时间:2016-05-03 13:02:05

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

尝试在Visual Studio 2015中更新Web时发布TypeScript项目;构建成功,但Package / Publish失败:

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源,将其设置为无/不复制。但是这里真的很奇怪:

任意更改"无"和#34; TypeScript编译" (设置或取消设置)项目中的.TS文件将允许我的项目成功发布到服务器,并且没有部署已转换的.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">

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

我有同样的问题。我将Visual Studio的TypeScript工具升级到2.1.4,现在一切都很好

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