【问题标题】:How to include TypeScript files when publishing?发布时如何包含 TypeScript 文件?
【发布时间】:2014-06-20 07:26:54
【问题描述】:

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

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

TypeScript 文件具有“构建操作”:“TypeScriptCompile”,并且我已经使用“请勿复制”和“始终复制”测试了“复制到输出目录”,但 .ts 文件仍然没有发布。

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

(我将 VS2013 Update 2 与 TypeScript 1.0.1 和 Web Essentials 2013 用于 Update 2)

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 很遗憾,在发布项目时,.ts 文件仍然没有被复制。
    • @GeirSagberg 确保您发布“调试”配置。或者只是删除 Condition="'$(Configuration)'=='Debug'"
    • 这对我不起作用。我需要在 XML 的某个部分中添加它吗?
    • @Homer 它应该在 csproj 文件中的 注释元素附近。确保您在发布期间使用“调试”配置(当前发布设置,而不是 vs 中的项目设置)。
    • @StasBerkov,在评论部分工作后添加它,谢谢!
    【解决方案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>
    

    我将它作为.csproj 文件的&lt;Project&gt; 中的最后一个元素。

    【讨论】:

      【解决方案3】:

      首先,您可以查看已发布的目录以查看文件是否存在。 您可以使用 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 中有 import 子句...
      • 重现: 1. 创建一个新的 Web 应用程序项目 (MVC)。 2. 添加一个带有'console.log("Hello world")'的打字稿文件"file1.ts",标记为"Copy Always"。 3. 发布到文件。 4.注意只复制“file1.js”。我怀疑这与打字稿编译器有关。
      【解决方案4】:

      找到了这个帖子,@StanislavBerkov 的解决方案完美地发布到包含ts-files。通过 Octopus deploy 部署我们的解决方案时,我们开始遇到问题,但没有再次添加 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 文件中递归添加所有文件来解决此问题,如下所示:&lt;file src="src/**/*.ts" /&gt;

      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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多