如何在发布时包含TypeScript文件?

29

我有一个MVC 5.1 Web应用程序,最近开始使用TypeScript。我想使用sourcemapping,因此在项目中包括了.ts,.js和.js.map文件。

当我发布应用程序(例如到文件系统或Azure)时,只有.js和.js.min文件被复制,而不是.ts文件。这意味着我在发布的站点上无法获得源映射。

TypeScript文件的“Build Action”为“TypeScriptCompile”,我已经尝试过将“Copy to Output Directory”设置为“Do not copy”和“Copy always”,但仍然未发布.ts文件。

如何在发布应用程序时包括.ts文件?

(我正在使用带有TypeScript 1.0.1和Web Essentials 2013 for Update 2的VS2013 Update 2)

4个回答

35

我通过编辑项目(csproj)文件来实现这一点。我将.ts文件(它们存储在TypeScriptCompile项目中)包含到Content项目中,即:

我通过编辑项目(csproj)文件来实现这一点。我将.ts文件(它们存储在TypeScriptCompile项目中)包含到Content项目中,即:

  <Target Name="AddTsToContent" AfterTargets="CompileTypeScript" Condition="'$(BuildingProject)' != 'false'">
     <ItemGroup>
        <Content Include="@(TypeScriptCompile)" Condition="'$(Configuration)'=='Debug'"/>
     </ItemGroup>
  </Target>

注意:由于条件限制,这仅适用于Debug构建配置的TypeScript内容。


1
很遗憾,在发布项目时,.ts文件仍未被复制。 - Geir Sagberg
5
@GeirSagberg请确保发布“Debug”配置。或者只需删除Condition="'$(Configuration)'=='Debug'"。 - Stanislav Berkov
1
这对我不起作用。我需要把它添加到 XML 的特定部分中吗? - Homer
4
@Homer,这应该在csproj文件中的注释元素<Target Name="BeforeBuild">附近。确保在发布期间使用“Debug”配置(当前发布设置,在vs中不是项目设置)。 - Stanislav Berkov
@StasBerkov,在注释部分后面添加它确实起作用了,谢谢! - Homer
在我能够看到它们之前,我还需要按照这个答案添加MIME类型:https://dev59.com/vHLYa4cB1Zd3GeqPUzfM - iCollect.it Ltd

6

根据 Stas Berkov的回答,只有在生成源代码映射时(根据项目属性中TypeScript Build选项协助),我才会有条件地包含.ts文件。

<Target Name="AddTsToContent" AfterTargets="CompileTypeScript" Condition="'$(BuildingProject)' != 'false'">
  <ItemGroup>
    <Content Include="@(TypeScriptCompile)" Condition="'$(TypeScriptSourceMap)' == 'true'"/>
  </ItemGroup>
</Target>

我把这个放在 <Project> 的最后一个元素中,它位于 .csproj 文件中。

1
首先,您可以查看已发布的目录,以确定文件是否存在。您可以使用MSBuild在本地进行复制:
msbuild path/to/your/solution.sln-or-project.csproj /p:OutputPath=path/to/outputFolder /p:Configuration=Release

运行此命令后,您可以在文件夹中搜索您的 .ts 文件:
outputFolder/_bin/PublishedWebsites/YourProjectName/

在执行MSBuild任务“CopyFilesToOutputDirectory”期间,项目的所有输出都会复制到输出目录中。
如果在运行MSBuild命令后,标记为“始终复制”或“仅在更新时复制”的.ts文件仍未被复制,那么很可能是您的项目文件没有导入由Microsoft提供的常见目标文件,在其中定义了任务“CopyFilesToOutputDirectory”。
在这种情况下,请编辑您的.csproj文件,并添加一个导入子句到适当的文件中,如下所示:
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />

尝试在导入Microsoft.WebApplication.targets后再次运行MSBuild命令,应该会将标记为发布的文件放入输出文件夹中。

.ts 文件已被复制到输出目录,但未复制到 PublishedWebsites/ProjectName/... 子目录中。 我的 .csproj 文件中有导入条款… - Geir Sagberg
复现步骤如下: 1.创建一个新的Web应用程序项目(MVC)。 2.添加一个名为“file1.ts”的TypeScript文件,其中包含‘console.log("Hello world")’,并标记为“始终复制”。 3.发布到文件。 4.请注意只有“file1.js”被复制。我怀疑这与TypeScript编译器有关。 - Geir Sagberg

0
发现了这个线程,@StanislavBerkov的解决方案完美地解决了包含ts-files的发布问题。然而,当我们通过章鱼部署解决方案时,我们开始遇到问题,没有添加ts-files
在我们的构建服务器上检查了我们的msbuild命令,并添加了输出路径。
& "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\msbuild.exe" "C:\Users\MyUser\Documents\Project\Solution\solution.sln" /t:"Clean;Build" /p:Configuration=Release /p:OutputPath="C:\Users\MyUser\Documents\Project\outputFolder" /p:AllowedReferenceRelatedFileExtensions=none /p:RunOctoPack=true /p:OctoPackEnforceAddingFiles=true /p:OctoPackNuGetProperties="env=Test;change=TestChange"

查看输出文件夹中的 _PublishedWebsites,所有的 .ts 文件 都存在。但是查看由 Octopack 生成的 .nupkg 文件时,所有的 ts 文件 都不见了!显然,Octopack 不包括 TypeScript 文件。

https://help.octopus.com/t/octopack-doesnt-include-typescript-output-files/5009

通过在 NuSpec 文件中递归添加所有文件,解决了这个问题,如下所示:<file src="src/**/*.ts" />

https://octopus.com/docs/packaging-applications/creating-packages/nuget-packages/using-octopack/octopack-to-include-buildevent-files

如何在 NuSpec 文件中递归包含目录

完整的 nuspec 参考:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>Project.Web.$env$</id>
    <version>$version$</version>
    <authors>Administrator</authors>
    <owners>Administrator</owners>
    <licenseUrl>http://example.com</licenseUrl>
    <projectUrl>http://example.com</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Project nuget packages</description>
    <releaseNotes />
  </metadata>

   <files>
      <file src="src/dist/" target="/" />
      <file src="src/**/*.ts" />
   </files>
</package>

https://learn.microsoft.com/en-us/nuget/reference/nuspec

我希望这可以为其他人节省时间!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接