发布时如何包含TypeScript文件?

时间:2014-06-20 07:26:54

标签: deployment visual-studio-2013 typescript asp.net-mvc-5.1

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

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

TypeScript文件有“Build Action”:“TypeScriptCompile”,我已经使用“Do not copy”和“Copy always”测试了“Copy to Output Directory”,但仍未发布.ts文件。 / p>

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

(我正在使用VS1013 Update 2与TypeScript 1.0.1和Web Essentials 2013 for Update 2)

4 个答案:

答案 0 :(得分:34)

我是通过编辑项目(csproj)文件实现的。我将.ts(它们存储在 TypeScriptCompile 项目中)文件包含在 Content 项目中,即

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

注意:由于条件,这仅包括Debug构建配置的TypeScript内容。

答案 1 :(得分:2)

基于Stas Berkov's answer,我仅在生成源地图时有条件地包含.ts文件(在项目属性的TypeScript Build标签中配置)。

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

我将此作为<Project>文件的.csproj中的最后一个元素。

答案 2 :(得分: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任务期间,项目的所有输出都会复制到输出目录,并且#34; CopyFilesToOutputDirectory &#34;。

如果在运行MSBuild命令之后,您的.ts文件被标记为&#34;始终复制&#34;或者&#34;复制如果更新&#34;仍然没有被复制,很可能你的项目文件没有导入Microsoft提供的公共目标文件,其中任务&#34; CopyFilesToOutputDirectory &#34;是定义。

在这种情况下,编辑.csproj文件,将import子句添加到相应的文件中,如下所示:

<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />

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

答案 3 :(得分: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"

在outputFolder中查看_PublishedWebsites,所有.ts-files都存在。但是,查看由Octopack生成的.nupkg文件后,所有ts-files都消失了!显然,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

How to include directories recursively in NuSpec file

完整的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://docs.microsoft.com/en-us/nuget/reference/nuspec

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