7

ノードを使用してjavascriptファイルを縮小および連結するWebプロジェクトでビルド前イベントがあります。これにより、ファイルが縮小されていることを除いてスクリプト フォルダーの複製であるスクリプト フォルダーに BuiltScripts というフォルダーが作成されます。展開を行っているときに、BuiltScripts フォルダーを含むスクリプト フォルダーを公開したいと考えています。これを実現するために、BuiltScripts フォルダーをプロジェクトに追加しました。これは次のような理想的なソリューションではありません。

  1. ソリューションがソース管理下にあるため、その中のファイルは読み取り専用であるため、ビルドするには、BuiltScripts フォルダーをチェックアウトする必要があります。非常に多くのファイルがチェックアウトされているため、チェックイン時に手間がかかります。
  2. プロジェクトに新しいファイルを追加するときは、忘れずに BuiltScripts フォルダーに追加する必要があります。そうしないと、ファイルのビルド バージョンがデプロイされません。
  3. BuiltScripts フォルダー内のファイルも読み取り専用であるため、ビルド サーバーでビルドが失敗します。
  4. 同じ名前のファイルのコピーが 2 つあると、ファイルを検索してテキスト ベースの検索を行うときに問題になります。

ビルド サーバーにビルド前のステップとして JavaScript ファイルをビルドして縮小させたいのですが、BuiltScripts フォルダーをプロジェクトに追加したくありません。ただし、ビルド サーバーが最後にプロジェクトをパッケージ化するときに、ビルド プロセスの出力と共に BuiltScripts フォルダーをコピーする必要があります。どうすればこれを達成できますか?

4

3 に答える 3

7

プロジェクト プロパティのビルド前イベントを使用する代わりに (これはあなたの言いたいことだと思います)、.csproj/.vbproj ファイルの BeforeBuild ターゲットをオーバーライドします。

<Project ...>
  ...
  <Target Name="BeforeBuild">
    <!-- Create the 'BuildScripts' directory. -->
    <!-- The $(IntermediateOutputPath) reference the 'obj' folder, which I like to -->
    <!-- use for these kinds of things. -->
    <MakeDir Directories="$(IntermediateOutputPath)BuiltScripts">
      <Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" />
    </MakeDir>
    <!-- Execute the javascript minifier. -->
    <Exec Command="..." />
    <!-- Create an item group for the minified scripts so we manipulate the target path. -->
    <CreateItem Include="$(BuildScriptsPath)\*.js">
      <Output ItemName="BuiltScripts" TaskParameter="Include" />
      <Output ItemName="FileWrites" TaskParameter="Include" />
    </CreateItem>
    <!-- Add the minified scripts to the Content item group, -->
    <!-- which the deployment MSBuild inspects for files to deploy. -->
    <CreateItem Include="@(BuiltScripts)"
      AdditionalMetadata="TargetPath=scripts\%(Filename)%(Extension)">
      <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
    </CreateItem>
  </Target>
  ...
</Project>

ファイルが正しいディレクトリに展開されない場合は、CreateItem タスクの出力であるコンテンツ アイテム グループの形状をいじる必要がある場合があります。item トランスフォームを使用してターゲット パスを作成したことに注意してくださいscripts\YourScript.js

また、最初の CreateItem タスクが出力を「FileWrites」という項目グループに詰め込むことにも注意してください。Clean ターゲットがその項目グループを検査して、削除するファイルを認識していることを発見しました。

その XML をプロジェクト ファイルの要素の後に配置すると、準備完了です。<Import>ソース管理にチェックインする必要はなく、ビルド サーバーも問題なく動作します。

于 2012-10-15T00:11:17.753 に答える
0

ビルド後のイベントを使用して、スクリプトを実行して目的を実行することはできませんか? 私は 1 つを使用して、出力ファイルをプロジェクトとはまったく関係のない場所に移動します。プレーン バッチ、VBScript/JScript、または PowerShell のいずれであっても、ほとんど何でも実行できます。

于 2012-10-12T05:37:34.403 に答える
0

同様の要件がありましたが、既存のファイルをビルドの一部として生成するのではなく、展開パッケージに追加するだけでした。このページのテクニックは役に立ちました。

于 2013-11-19T09:59:03.617 に答える